美文网首页
php字符串处理之全角半角转换

php字符串处理之全角半角转换

作者: Medicine_8d60 | 来源:发表于2019-08-06 14:59 被阅读0次

半角全角的处理是字符串处理的常见问题,本文尝试为大家提供一个思路。

一、概念

全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20)
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
所以可以直接通过用+-法来处理非空格数据,对空格单独处理

二、实现思路

  1. 找到目标unicode的字符,可以使用正则表达式解决

  2. 修改unicode编码

三、实现

  1. 首先是两个unicode与字符的转换函数:
/**
     * 将unicode转换成字符
     * @param int $unicode
     * @return string UTF-8字符
     **/
    function unicode2Char($unicode){
        if($unicode < 128)     return chr($unicode);
        if($unicode < 2048)    return chr(($unicode >> 6) + 192) .
                                      chr(($unicode & 63) + 128);
        if($unicode < 65536)   return chr(($unicode >> 12) + 224) .
                                      chr((($unicode >> 6) & 63) + 128) .
                                      chr(($unicode & 63) + 128);
        if($unicode < 2097152) return chr(($unicode >> 18) + 240) .
                                      chr((($unicode >> 12) & 63) + 128) .
                                      chr((($unicode >> 6) & 63) + 128) .
                                      chr(($unicode & 63) + 128);
        return false;
    }
 
    /**
     * 将字符转换成unicode
     * @param string $char 必须是UTF-8字符
     * @return int
     **/
    function char2Unicode($char){
        switch (strlen($char)){
            case 1 : return ord($char);
            case 2 : return (ord($char{1}) & 63) |
                            ((ord($char{0}) & 31) << 6);
            case 3 : return (ord($char{2}) & 63) |
                            ((ord($char{1}) & 63) << 6) |
                            ((ord($char{0}) & 15) << 12);
            case 4 : return (ord($char{3}) & 63) |
                            ((ord($char{2}) & 63) << 6) |
                            ((ord($char{1}) & 63) << 12) |
                            ((ord($char{0}) & 7)  << 18);
            default :
                trigger_error('Character is not UTF-8!', E_USER_WARNING);
                return false;
        }
    }
  1. 全角转半角
/**
     * 全角转半角
     * @param string $str
     * @return string
     **/
    function sbc2Dbc($str){
        return preg_replace(
            // 全角字符 
            '/[\x{3000}\x{ff01}-\x{ff5f}]/ue',
            // 编码转换
            // 0x3000是空格,特殊处理,其他全角字符编码-0xfee0即可以转为半角
            '($unicode=char2Unicode(\'\0\')) == 0x3000 ? " " : (($code=$unicode-0xfee0) > 256 ? unicode2Char($code) : chr($code))',
            $str
        );
    }
  1. 半角转全角
/**
     * 半角转全角
     * @param string $str
     * @return string
     **/
    function dbc2Sbc($str){
        return preg_replace(
            // 半角字符 
            '/[\x{0020}\x{0020}-\x{7e}]/ue',  
            // 编码转换
            // 0x0020是空格,特殊处理,其他半角字符编码+0xfee0即可以转为全角
            '($unicode=char2Unicode(\'\0\')) == 0x0020 ? unicode2Char(0x3000) : (($code=$unicode+0xfee0) > 256 ? unicode2Char($code) : chr($code))',
            $str
        );
    }

四、测试

示例代码:

$a = 'abc12 345';
$sbc = dbc2Sbc($a);
$dbc = sbc2Dbc($sbc);
var_dump($a, $sbc, $dbc);

结果:

string(9) "abc12 345"
string(27) "abc12 345"
string(9) "abc12 345"

相关文章

  • php字符串处理之全角半角转换

    半角全角的处理是字符串处理的常见问题,本文尝试为大家提供一个思路。 一、概念 全角字符unicode编码从6528...

  • 全角半角转换

    今天遇到全角半角的问题。(仅供自己学习记录)

  • go 全角转换半角

    google了半天,并没有很清晰的答案,这里记录下;golang里面完成这件事情是用rune和strings里面的...

  • 文本函数ASC和WIDECHAR

    ASC函数 1、用途: 将全角字符转换为半角字符 。 2、语法: ASC(text) 参数: Text 要进行半角...

  • SQL Server 全角半角转换

    哪些字符是有全角和半角之分的? 首先,中文是只有全角,没有半角之分,所以转换的时候可以忽略掉中文字符。 英文字符与...

  • Oracle替换全角为半角

    函数:to_single_byte(c)转换成半角to_multi_byte(c)转换成全角实例:SELECT '...

  • js 日语全半角转换

    1、js 日语全半角转换 客户的需求是,输入半角字符或日语假名,筛选出来的结果显示包含该字符的半角形式和全角形式的...

  • 2019-01-07

    Day18【学员昵称】:沐沐【学习内容】:10.4 大小写、全角半角转换【学习心得】:学习函数用处大,随心所欲全角...

  • 全角\半角

    在传统的字体排印学中,将文字字身长宽比为1比1的正方形金属铅字称作“全身”,而宽度只有一半的称为“半身”日本人将其...

  • 全角和半角的区别

    什么是全角和半角? (1) 全角:指一个字符占用两个标准字符位置。全角占两个字节。 不管是半角还是全角,汉字...

网友评论

      本文标题:php字符串处理之全角半角转换

      本文链接:https://www.haomeiwen.com/subject/yhzidctx.html