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

一、概念

全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)例如:/[\x{3010}]/    在正则中代表'【'.
半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20)
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
所以可以直接通过用+-法来处理非空格数据,对空格单独处理

二、实现思路

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

2. 修改unicode编码

三、实现

1. 首先是两个unicode与字符的转换函数:

 1     /**
 2      * 将unicode转换成字符
 3      * @param int $unicode
 4      * @return string UTF-8字符
 5      **/
 6     function unicode2Char($unicode){
 7         if($unicode < 128)     return chr($unicode);
 8         if($unicode < 2048)    return chr(($unicode >> 6) + 192) .
 9                                       chr(($unicode & 63) + 128);
10         if($unicode < 65536)   return chr(($unicode >> 12) + 224) .
11                                       chr((($unicode >> 6) & 63) + 128) .
12                                       chr(($unicode & 63) + 128);
13         if($unicode < 2097152) return chr(($unicode >> 18) + 240) .
14                                       chr((($unicode >> 12) & 63) + 128) .
15                                       chr((($unicode >> 6) & 63) + 128) .
16                                       chr(($unicode & 63) + 128);
17         return false;
18     }
19
20     /**
21      * 将字符转换成unicode
22      * @param string $char 必须是UTF-8字符
23      * @return int
24      **/
25     function char2Unicode($char){
26         switch (strlen($char)){
27             case 1 : return ord($char);
28             case 2 : return (ord($char{1}) & 63) |
29                             ((ord($char{0}) & 31) << 6);
30             case 3 : return (ord($char{2}) & 63) |
31                             ((ord($char{1}) & 63) << 6) |
32                             ((ord($char{0}) & 15) << 12);
33             case 4 : return (ord($char{3}) & 63) |
34                             ((ord($char{2}) & 63) << 6) |
35                             ((ord($char{1}) & 63) << 12) |
36                             ((ord($char{0}) & 7)  << 18);
37             default :
38                 trigger_error('Character is not UTF-8!', E_USER_WARNING);
39                 return false;
40         }
41     }

2. 全角转半角

 1     /**
 2      * 全角转半角
 3      * @param string $str
 4      * @return string
 5      **/
 6     function sbc2Dbc($str){
 7         return preg_replace(
 8             // 全角字符
 9             '/[\x{3000}\x{ff01}-\x{ff5f}]/ue',
10             // 编码转换
11             // 0x3000是空格,特殊处理,其他全角字符编码-0xfee0即可以转为半角
12             '($unicode=char2Unicode(\'\0\')) == 0x3000 ? " " : (($code=$unicode-0xfee0) > 256 ? unicode2Char($code) : chr($code))',
13             $str
14         );
15     }

3. 半角转全角

 1     /**
 2      * 半角转全角
 3      * @param string $str
 4      * @return string
 5      **/
 6     function dbc2Sbc($str){ 7         return preg_replace(
 8             // 半角字符
 9             '/[\x{0020}\x{0020}-\x{7e}]/ue',
10             // 编码转换
11             // 0x0020是空格,特殊处理,其他半角字符编码+0xfee0即可以转为全角
12             '($unicode=char2Unicode(\'\0\')) == 0x0020 ? unicode2Char(0x3000) : (($code=$unicode+0xfee0) > 256 ? unicode2Char($code) : chr($code))',
13             $str
14         );
15     }

四、测试

示例代码:

1 $a = 'abc12 345';
2 $sbc = dbc2Sbc($a);
3 $dbc = sbc2Dbc($sbc);
4
5 var_dump($a, $sbc, $dbc);

结果:

1 string(9) "abc12 345"
2 string(27) "abc12 345"
3 string(9) "abc12 345"

php字符串处理之全角半角转换(正则匹配全角字符思路)相关推荐

  1. python中英文半角还是全角_Python实现全角半角转换的方法

    本文实例讲解了Python实现全角半角转换的方法,相信对于大家的Python学习能够起到一定的参考借鉴价值.如下所示: 一.全角半角转换概述: 全角字符unicode编码从65281~65374 (十 ...

  2. java 全角数字 转 数字_JavaScript数字全角半角转换代码教程

    javascript数字全角半角转换代码教程 ///全角空格为12288,半角空格为32 ///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 //半角转换 ...

  3. php amp 字符串处理,php字符串处理之全角半角转换

    半角全角的处理是字符串处理的常见问题,本文尝试为大家提供一个思路. 一.概念 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E) 半角字符unicode编 ...

  4. PHP全角和半角字符怎么区分,php字符串处理之全角半角转换,php字符串全角半角_PHP教程...

    php字符串处理之全角半角转换,php字符串全角半角 半角全角的处理是字符串处理的常见问题,本文尝试为大家提供一个思路. 一.概念 全角字符unicode编码从65281~65374 (十六进制 0x ...

  5. python中英文半角还是全角_如何理解python3的unicode,以及全角半角转换

    匿名用户 1级 2017-11-06 回答 1. unicode是一个编码的standard,表明了字符与数字之间的映射,是可变长的. 2. 映射后的数据如何编码为字节?这个就是具体的编码规则:目前最 ...

  6. java 全角_java字符全角半角转换

    序 本文展示一下如何将char进行半角与全角转换. 术语 全角 SBC case Sexagesimal to Binary Converter 60进制转为2进制 半角 DBC case Decim ...

  7. 计算机中全半角转换是干什么的,全角半角切换快捷键(电脑全角和半角怎么切换)...

    搜狗输入法的全角半角切换键是:shift+空格键 (如当前在半角状态,按shift+空格键可以切换至全角:如当前在全角状态,按shift+空格键可以切换至半角) 半角与全角切换的意义 1.添加输入法不 ...

  8. html自动半角转全角,全角半角转换就是这么简单

    在Excel表格中输入数字的时候有时会发现数字的间距特别大,这不仅不美观还占位置,那么到底是什么原因导致这样呢?其实数字间距大是因为输入法的全角半角,只要我们切换下就可以轻松解决问题了,接下来小编就来 ...

  9. Java 全角半角转换工具类

    /*** @author: lee* @Date: 2018/11/29 09:56* @Description: 全角半角转换工具类*/ public class AsciiUtil {public ...

最新文章

  1. 拉开你和同龄人差距的,不是基因,不是努力,而是……
  2. 【OSS 排查方案-5】透过现象看本质之网络排查分析
  3. 使用 HTTP 缓存防止不必要的网络请求
  4. Android开发学习之路-Git的极简教程?
  5. MySQL5.7升级到8.0 之后,配合ubantu18.04遇到的常规问题以及非常规问题的解决方案
  6. Web服务器网管交流一下
  7. onloadsuccess: function获取不到表格数据_R语言输格式技巧系列(二),再精细一点,定制包含亚组的表格...
  8. 太空大战背景移动的几种方式
  9. Linux:ubuntu 下安装软件,卸载,查看已经安装的软件
  10. PdfJS使用的一些说明
  11. ONVIF协议基础概念
  12. python卖水果_用Python解决一个简单的水果分类问题
  13. 一行代码蒸发64亿?!形式化验证帮你一秒避免悲剧
  14. 华硕主板装系统蓝屏_华硕主板装系统蓝屏怎样设置bios?
  15. echarts散点图使用(转:http://www.suchso.com/UIweb/echarts-sandiantu.html)
  16. 【转载】超简单集成HMS ML Kit 人脸检测实现可爱2D贴纸
  17. 光通量发光强度照度亮度关系_有关发光强度、光通量、照度、亮度的简单介绍...
  18. 关于手机店、电脑城,存在的物联卡的情况说明
  19. 高质量项目管理-甘特图模板+教程(附下载包)/ PMP项目管理可用
  20. Golang 本地缓存选型对比及原理总结

热门文章

  1. 十年AI学者影响力盘点:何恺明排名第一,成为全球最具影响力学者
  2. calander时间相关整合
  3. Actor模型与传统模型
  4. NewStarCTF 公开赛赛道 WEEK2 pwn 砍一刀
  5. python小作业8代码(列表的遍历与嵌套)
  6. 调用个人微信的API接口实现微信收发消息
  7. c语言中tho什么意思,干货丨与老外聊天常用的英文缩写,速度get
  8. LaTeX 嵌入MATLAB 绘图的字体
  9. swift 中构建3DTouch 及 widget
  10. 服务器(CentOS7)配置Jupyter Notebook远程访问