dmz社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7423|回复: 96

[功能实现] php字符串处理之全角半角转换

  [复制链接]
  • TA的每日心情

    2024-11-19 20:46
  • 签到天数: 244 天

    [LV.8]以坛为家I

    4434

    主题

    1459

    帖子

    1万

    积分

    会|员

    Rank: 9Rank: 9Rank: 9

    积分
    10839
    发表于 2018-12-26 23:03:51 | 显示全部楼层 |阅读模式

    本站资源全部免费,回复即可查看下载地址!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    半角全角的处理是字符串处理的常见问题,本文尝试为大家提供一个思路。
    一、概念
    全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
    半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
    空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20)
    而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
    所以可以直接通过用+-法来处理非空格数据,对空格单独处理
    二、实现思路
    1. 找到目标unicode的字符,可以使用正则表达式解决
    2. 修改unicode编码
    三、实现
    1. 首先是两个unicode与字符的转换函数:
    [PHP] 纯文本查看 复制代码
    /**
         * 将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;
            }
        }

      2. 全角转半角
    [PHP] 纯文本查看 复制代码
    /**
         * 全角转半角
         * @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
            );
        }

    3. 半角转全角
    [PHP] 纯文本查看 复制代码
    /**
         * 半角转全角
         * @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
            );
        }

    四、测试
    示例代码:
    [PHP] 纯文本查看 复制代码
    $a = 'abc12 345';
    $sbc = dbc2Sbc($a);
    $dbc = sbc2Dbc($sbc);
    
    var_dump($a, $sbc, $dbc);

    结果:
    [PHP] 纯文本查看 复制代码
    string(9) "abc12 345"
    string(27) "abc12 345"
    string(9) "abc12 345"



    回复

    使用道具 举报

    该用户从未签到

    23

    主题

    8155

    帖子

    1052

    积分

    荣誉会员

    积分
    1052

    发表于 2018-12-27 16:50:12 | 显示全部楼层
    过来看看的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    7864

    帖子

    958

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    958

    发表于 2018-12-30 09:13:16 | 显示全部楼层
    这是什么东东啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    8041

    帖子

    1038

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1038

    发表于 2019-1-2 10:53:17 | 显示全部楼层
    找到好贴不容易,我顶你了,谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    7959

    帖子

    979

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    979

    发表于 2019-1-3 01:10:09 | 显示全部楼层
    不知该说些什么。。。。。。就是谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17

    主题

    7958

    帖子

    986

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    986

    发表于 2019-1-4 04:42:43 | 显示全部楼层
    么有分,谁能送我点积分啊::>_<::
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    8093

    帖子

    1091

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1091

    发表于 2019-1-9 14:11:37 | 显示全部楼层
    这是什么东东啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18

    主题

    7942

    帖子

    960

    积分

    荣誉会员

    积分
    960

    发表于 2019-1-11 01:02:10 | 显示全部楼层
    正需要,支持楼主大人了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    3615

    帖子

    2

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    2

    发表于 2019-1-11 15:35:12 | 显示全部楼层
    好好 学习了 确实不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    49

    主题

    7865

    帖子

    940

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    940

    发表于 2019-1-13 00:43:32 | 显示全部楼层
    有竞争才有进步嘛
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|本站代理|dmz社区

    GMT+8, 2025-2-2 06:46 , Processed in 0.240588 second(s), 38 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表