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

一、概念

全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)

半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)

空格比较特殊,全角为 12288(0x3000),半角为 32 (0x20)

而且除空格外,全角/半角按unicode编码排序在顺序上是对应的

所以可以直接通过用+-法来处理非空格数据,对空格单独处理

二、实现思路

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

修改unicode编码

三、实现

首先是两个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;

}

}

全角转半角

/**

* 全角转半角

* @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

);

}

半角转全角

/**

* 半角转全角

* @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 半角全角,php字符串处理之全角半角转换相关推荐

  1. java 正则表达式替换多个全角空格为一个半角空格_去掉字符串两端的全角空格和半角空格(含源代码)...

    昨天,遇到了一个技术问题.本来我在程序中用的trim()方法来处理从JSP页面传来的值,后来在测试时,发现当我输入的是全角空格时,trim()方法失效. 需求是这样的,只是去掉字符串两端的空格(不论是 ...

  2. 去掉字符串两端的全角空格和半角空格(含源代码)

    昨天,遇到了一个技术问题.本来我在程序中用的trim()方法来处理从JSP页面传来的值,后来在测试时,发现当我输入的是全角空格时,trim()方法失效. 需求是这样的,只是去掉字符串两端的空格(不论是 ...

  3. php字符串处理之全角半角转换(正则匹配全角字符思路)

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

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

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

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

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

  6. php字符串里含有全角符号,php将字符串中全角字符转换为半角字符_PHP教程

    php将字符串中全角字符转换为半角字符 php将字符串中全角字符转换为半角字符,摘自ecshop. /** * 将一个字串中含有全角的数字字符.字母.空格或'%+-()'字符转换为相应半角字符 * @ ...

  7. 圆角半角数据库_数据库使用技巧——SQL 全角与半角切换

    select cast('111' as int) as num1 select cast('111' as int) as num2 运行结果: 第一个正确显示: 111 第二个则报错: 在将 va ...

  8. 半角和全角的区别 java_输入法全角和半角的区别是什么?【详解】

    导语:今天为大家介绍的是全角和半角的区别,还有就是全角和半角的切换方法.可能有的人还是第一次听到全角和半角,小编先来解释一下,我们在使用中文输入法打字的时候,在右下角的输入法表面有一个月牙形状的符号, ...

  9. java 判断字符和字符串是否为全角字符

    java 判断字符和字符串是否为全角字符 一般这个判断在对未知字符串进行字符转码的时候要用到. // 判断字符串是否为全角String input = "dd";System.ou ...

最新文章

  1. AI芯片结构目标图形处理
  2. iOS Podfile里面的use_frameworks!引发的血案
  3. Windows Server 2008安装Memcached笔记
  4. 有哪些大数据处理工具?
  5. Apache负载均衡设置方法: mod_proxy
  6. js回调函数的理解(轉)
  7. 第一百零一期:如何处理ASP .NET Core中的cookie?
  8. 公共界面_公共建筑东营市档案馆能耗计量分析系统
  9. Android中用OpenGL ES Tracer分析绘制过程
  10. 数值分析matlab实验报告,数值分析第一次作业matlab实验报告.doc
  11. BestCoder Round #70
  12. python大数据和java大数据的区别-做大数据工程师,语言选Java还是Python?
  13. html动态图片怎么设背景,[gif制作教程]如何把gif动态图片的背景变透明,仍保留有动画效果...
  14. VIN码识别/车架号识别独家支持云识别
  15. 磁盘被写保护怎么解除?取消写保护状态,只需这几步
  16. 我对于创业公司的看法
  17. 微信小程序小说搭建流程
  18. 徒步运动软件怎么申请测试,专业人士教你如何顺利完赛50公里徒步
  19. 安装heg时找不到java,记录安装HEG的坑
  20. php输出次方,php如何实现数值的整数次方(代码实例)

热门文章

  1. Ps制作食物网站展示
  2. 罗技无线网卡linux,Linux(Ubuntu)装罗技LMS避坑指南
  3. 学习WEB前端第四天(3)-背景图像
  4. 计算机硬盘写入量,如何查询固态硬盘SSD的总写入量?
  5. 业务中继承关系研究(数据库)
  6. Otterctf 2018 内存取证
  7. 提取 Office 2016 工具栏图标
  8. 哈利.波特与混血王子
  9. axios 框架的介绍和基本使用
  10. 数据库连接池的管理思想