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

转载 2013年12月03日 13:33:15
一,中文字符转十进制原理分析

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()就可以把十六进制的字符串通过组合转换为正常的中文汉字

二、八、十、十六进制转换(图解篇)

下面是二、八、十、十六进制之间关系的结构图: 下文会分4个部分对这个图进行分解,针对每个部分会以图文的形式进行讲解: (二、八、十六进制) → (十进制);(十进制) ...
  • rorntuck7
  • rorntuck7
  • 2016年04月22日 11:33
  • 635

字符串转十六进制与十六进制转字符串示例

package stringtohex; /** * java中使用16位(2个字节)的Unicode字符集编码作为字符编码格式。 * char类型的值也可直接作为整数类型的值来使用,但它是一个1...
  • hxysea
  • hxysea
  • 2014年05月17日 09:55
  • 1296

十六进制字符串转中文

16进制转中文字符串
  • sinat_33338482
  • sinat_33338482
  • 2017年04月26日 15:34
  • 509

2、8、10、16进制转换方法

这是一节“前不着村后不着店”的课。不同进制之间的转换纯粹是数学上的计算。不过,你不必担心会有么复杂,无非是乘或除的计算。 生活中其实很多地方的计数方法都多少有点不同进制的影子。 比如我们最...
  • think12
  • think12
  • 2013年02月19日 17:20
  • 2630

八进制转义字符

项目中遇到了一个比较棘手的问题,是做一个网络自动登录功能的app。这个登录本来是用网页授权,然后js将密码是用md5加密,服务器又会生成一组随机数比如/032/222/332,这样需要向服务器post...
  • zzcchunter
  • zzcchunter
  • 2013年11月05日 11:03
  • 5332

String与十六进制数互转

废话不多说,请看: /** * 字符串转换成十六进制字符串 * @param String str 待转换的ASCII字符串 * @return Str...
  • lin772662623
  • lin772662623
  • 2013年03月06日 17:55
  • 65529

java中二进制、八进制、十六制相互转换

java中二进制、八进制、十六制相互转换  (2013-02-14 10:53:22) 标签:  java中二进制、八进制 分类: java技术问题 十进制转成十六进制: I...
  • cheng100523578
  • cheng100523578
  • 2014年03月08日 23:58
  • 941

十六进制Unicode编码字符串与中文字符串的相互转换

图书馆客户端项目中遇到的一个问题,得到的URL 是这样的 String baseurl = "http://innopac.lib.xjtu.edu.cn/availlim/search~S1...
  • leokelly001
  • leokelly001
  • 2015年04月22日 02:16
  • 8506

如何将16进制转化成汉字

国标码是一个四位十六进制数,每个国标码都对应着一个唯一的汉字或符号 国标编码就是中华人民共和国信息交换汉字编码标准(GB2312-80), 在此标准中制定了每一个汉字及非汉字符号的编码。规定将汉字...
  • cao478208248
  • cao478208248
  • 2014年04月07日 08:25
  • 4314

8进制字符串转16进制字符串(一)

//写一个函数实现8进制字符串到16进制字符串的转换 //例如: //输入"755"结果是"1ED" //输入"777777777777"结果是"FFFFFFFFF" (注意超过了32位) //答案...
  • QQ1084283172
  • QQ1084283172
  • 2014年10月25日 15:42
  • 1081
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中文字符转十,二,八 十六,进制原理分析
举报原因:
原因补充:

(最多只允许输入30个字)