PHP中实现中文字符进制转换原理分析

 更新时间:2011年12月06日 01:02:31   作者:  
中文字符编码研究系列第四期,PHP实现中文字符进制转换原理分析,主要讨论中文汉字转换为十进制和十六进制的方法,并掌握转换原理应用于实际开发。本文以GBK编码字符为例,讨论GBK编码的字符转换原理
一,中文字符转十进制原理分析

GBK编码中一个汉字由二个字符组成,获取汉字字符串的方法如下
复制代码 代码如下:

$string = "不要迷恋哥";
$length = strlen($string);
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]);
}
}
var_dump($result);

php-ord-dec-number
由于一个汉字为两个字符组成,通过ord()函数获取字符的ASCII值如果大于127时,就可以确定当前字符为一个汉字的前半部分,还需要获取汉字的后半部分。当然,这种判断的方法要结合具体的开发环境,如果存在ASCII值大于127的单个字符,这种方法判断显然就不正确。

PHP实现中文字符转十进制的原理就是通过for循环的方法获取一个汉字的二个字符,然后使用ord()函数把各字符转换为十进制。如上分别是:不 [178 187] 要 [210 170] 迷 [195 212] 恋 [193 181] 哥 [184 231]

二,中文字符转十六进制原理分析

使用UltraEdit开发工具可以直接查看中文字符的十六进制,如下图

如,查看“不要迷恋哥”这五个字的十六进制
ultraedit-16-hex
从上面的图可以知道各个汉字对应该的十六进制字符分别是:不 B2BB 要 D2AA 迷 C3D4 恋 C1B5 哥 B8E7

PHP 实现中文字符转十六进制的原理就是首先使用ord()函数取出各个中文字符的十进制,具体可查看[PHP函数篇掌握ord()与chr()函数应用],然后使用dechex()函数把各个中文字符转化为十六进制

实例源代码
复制代码 代码如下:

$string = "不要迷恋哥";
$length = strlen($string);
echo $string;
$result = array();
//十进制
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]);
}
}
var_dump($result);
//十六进制
$strings = array();
foreach($result as $v){
$dec = explode(" ",$v);
$strings[] = dechex($dec[0])." ".dechex($dec[1]);
}
var_dump($strings);

结果如下图

php-dec-hex-string

通过上面的方法实现把中文字符转换为十六进制,输出结果可对比使用UltraEdit开发工具获取的十六进制。

三,中文字符转二进制和八进制原理分析

实现中文字符转二进制和八进制与上面的十六进制转换原理一样,只是转换的函数不同,结合上面的实例代码,实现如下

中文字符转二进制,方法如下
复制代码 代码如下:

$strings = array();
foreach($result as $v){
$dec = explode(" ",$v);
$strings[] = decbin($dec[0])." ".decbin($dec[1]);
}
var_dump($strings);

结果如下:
php-dec-bin-string
中文字符转八进制,方法如下
复制代码 代码如下:

$strings = array();
foreach($result as $v){
$dec = explode(" ",$v);
$strings[] = decoct($dec[0])." ".decoct($dec[1]);
}

结果如下:
php-string-hex
了解PHP实现中文字符进制转换原理,再通过PHP内置函数urldecode()就可以把十六进制的字符串通过组合转换为正常的中文汉字,请关注下一期中文字符编码研究系列之urldecode()与urlencode()函数字符编码原理。

相关文章

  • PHPCMS的使用小结

    PHPCMS的使用小结

    前段时间仔细看了一下PHPCMS这套开源的系统,实现了程序与模板分离,觉得写得真的不错。本人很少关注开源系统,尤其是PHP的,觉得PHP本身就是一个宠大的函数库,不过几千个系统函数确实解决了不少问题。
    2010-09-09
  • 自动分页的不完整解决方案

    自动分页的不完整解决方案

    自动分页的不完整解决方案...
    2007-01-01
  • php定义参数数量可变的函数用法实例

    php定义参数数量可变的函数用法实例

    这篇文章主要介绍了php定义参数数量可变的函数用法,实例分析了func_get_args的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 详解PHP解决守护进程Redis假死

    详解PHP解决守护进程Redis假死

    公司业务有一个常驻后台运行的守护进程。在这个守护进程当中使用了 Redis List 结构保存业务数据进行队列消费。结果运行过程中,有时候半个月,有时候几个月就会突然不再消费队列里面的数据。我们发现进行心中检测之后,程序的稳定性大大提高。
    2021-06-06
  • 解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示

    解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds

    最近做的程序中涉及到的循环比较多且处理的情况较复杂,在运行程序时出现执行超时提示如下:Fatal error: Maximum execution time of 30 seconds exceeded in D:\php\AppServ\www\sum3\test.php on line 3通过在网上搜索,找到了解决方法和大家分享,下面来一起看看吧。
    2016-11-11
  • 如何用Laravel包含你自己的帮助函数

    如何用Laravel包含你自己的帮助函数

    你可能想创建一个在应用的任何地方都可以访问的函数,这个篇文章将带你解决此问题,感兴趣的同学,可以参考下。
    2021-05-05
  • PHP中filter函数校验数据的方法详解

    PHP中filter函数校验数据的方法详解

    这篇文章主要是介绍PHP中filter函数校验数据的方法详解,PHP过滤器包含两种类型:Validation用来验证验证项是否合法 、Sanitization用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除,需要的朋友可以参考下
    2015-07-07
  • php数组比较实现查找连续数的方法

    php数组比较实现查找连续数的方法

    这篇文章主要介绍了php数组比较实现查找连续数的方法,实例分析了php数组查找及字符串操作的相关技巧,需要的朋友可以参考下
    2015-07-07
  • php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】

    php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】

    这篇文章主要介绍了php实现有序数组打印或排序的方法,涉及php针对数组的遍历、判断、构造与合并等常用操作技巧,并附带了Python、C及Go语言的实现代码,需要的朋友可以参考下
    2016-11-11
  • 发款php蜘蛛统计插件只要有mysql就可用

    发款php蜘蛛统计插件只要有mysql就可用

    有时候我们为了看一下蜘蛛爬行的情况,不得不对日志进行大量的分析,由此想做一款插件可以记录蜘蛛的情况。在第一次做的时候,只是记录下蜘蛛的爬行次数,不大好分析。
    2010-10-10

最新评论