chr() 函数
把 数字 转换成 ASCII码,例如:
<?php echo chr(61) . "<br>"; // 十进制 echo chr(061) . "<br>"; // 八进制值 echo chr(0x61) . "<br>"; // 十六进制值
ord() 函数
把 ASCII码 转换成 数字,例如:
<?php echo ord('s'); // 输出 115
温馨提示:
在 tcp socket 通讯中,我们需要把 文本/数字 转换成 ASCII码,因为操作系统底层是传输的是 一个一个字节(八位的二进制),而 ASCII码 正好是一个字节。
一、ord()函数的应用
ord()函数用于返回一个字符的ASCII值,最基本的用法如获取a 的ASCII值ord('a')返回 97,但在实际开发中,应用最多的还是用于字符截取函数中获取中文字符高低位编码的十进制数,如常见的中文字符截取函数具体可看看PHPWind或 Discuz!论坛源代码中substrs()函数或cutstr()函数,其原理就是通过ord()函数获取字符的ASCII码值,如果返回值大于 127则表示为中文字符的一半,再获取后一半组合成一个完整字符,同时结合字符编码如GBK或UTF-8等。
以GBK编码为例利用ord()函数判断中文字符返回各中文字符的ASCII值,代码如下 :
<?php $string = "不要迷恋哥"; $length = strlen($string); var_dump($string); // 原始中文 var_dump($length); // 长度 $result = array(); for ($i = 0; $i < $length; $i++) { if (ord($string[$i]) > 127) { $result[] = $string[$i] . ' ' . $string[++$i]; } } var_dump($result);
代码说明
1、定义一个变量$string,其值为字符串
2、获取变量的长度(字节数)
3、打印变量和变量的长度
4、通过for循环获取变量的各个字节值,把一个汉字的两个字节中间用空格隔开显示。
结果如下图
结果如下图
图解:“不要迷恋哥”为5个汉字,共10个字节(一个汉字2个字节),分别打印各个字节无法正常显示,如上图
初始值不变修改for循环部分代码显示各个字节ASCII值
$result = array(); for ($i = 0; $i < $length; $i++) { if (ord($string[$i]) > 127) { $result[] = ord($string[$i]) . ' ' . ord($string[++$i]); } } var_dump($result);
如上代码使用ord()函数打印各个字符的ASCII值,结果如下
通过ord()函数转换后就能正常查看各个字符的ASCII值。
二,chr()函数的应用
chr()函数的作用与ord()函数相反,用于返回指定的字符,如chr(97)返回a。
结合上面实例,只要获取到中文字符的ASCII值,就可以通过chr()函数组装出中文字符,代码如下
<?php $string = "不要迷恋哥"; $length = strlen($string); var_dump($string); // 原始中文 var_dump($length); // 长度 $result = array(); for ($i = 0; $i < $length; $i++) { if (ord($string[$i]) > 127) { $result[] = ord($string[$i]) . ' ' . ord($string[++$i]); } } var_dump($result); foreach ($result as $v) { $decs = explode(" ", $v); echo chr($decs[0]) . chr($decs[1]); }
结果如下图
如上代码并没有直接输出中文字符,但打印出正常的汉字,其原理是首先获取各个字节的ASCII值,通过chr()函数转化为字节,再把两个字节组合起来就形成了一个完整的中文汉字。
通过对ord()与chr()函数的讨论已经初步了解了中文字符的编码原理,了解GBK编码中一个汉字二个字节,使用ord()与chr()函数实现各字节转换方法,请关注下一期中文字符编码研究系列之中文字符编码转换原理。