一, 中文字符转十进制原理分析
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);
由于一个汉字为两个字符组成, 通过 ord()函数获取字符的 ASCII 值如果大于 127 时, 就可以确定当前字符为一个汉字的前半部分, 还需要获取汉字的后半部分当然, 这种判断的方法要结合具体的开发环境, 如果存在 ASCII 值大于 127 的单个字符, 这种方法判断显然就不正确
PHP 实现中文字符转十进制的原理就是通过 for 循环的方法获取一个汉字的二个字符, 然后使用 ord()函数把各字符转换为十进制如上分别是: 不 [178 187] 要 [210 170] 迷 [195 212] 恋 [193 181] 哥 [184 231]
二, 中文字符转十六进制原理分析
使用 UltraEdit 开发工具可以直接查看中文字符的十六进制, 如下图
如, 查看不要迷恋哥这五个字的十六进制
从上面的图可以知道各个汉字对应该的十六进制字符分别是: 不 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);
结果如下图
通过上面的方法实现把中文字符转换为十六进制, 输出结果可对比使用 UltraEdit 开发工具获取的十六进制
三, 中文字符转二进制和八进制原理分析
实现中文字符转二进制和八进制与上面的十六进制转换原理一样, 只是转换的函数不同, 结合上面的实例代码, 实现如下
中文字符转二进制, 方法如下
代码如下:
- $strings = array();
- foreach($result as $v){
- $dec = explode(" ",$v);
- $strings[] = decbin($dec[0])." ".decbin($dec[1]);
- }
- var_dump($strings);
结果如下:
中文字符转八进制, 方法如下
代码如下:
- $strings = array();
- foreach($result as $v){
- $dec = explode(" ",$v);
- $strings[] = decoct($dec[0])." ".decoct($dec[1]);
- }
结果如下:
了解 PHP 实现中文字符进制转换原理, 再通过 PHP 内置函数 urldecode()就可以把十六进制的字符串通过组合转换为正常的中文汉字, 请关注下一期中文字符编码研究系列之 urldecode()与 urlencode()函数字符编码原理
来源: https://www.php1.cn/detail/php-7bc4aee8df.html