在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
需求:内容按照【UNICODE使用Big Endian 字节顺序】编码后,需要转成16进制HEX字符串 UNICODE使用Big Endian 字节顺序 - UCS-2BE 转码如下: $content=strtoupper(bin2hex(iconv('utf-8','UCS-2BE',$content)));
最近在做一个百度词典的采集,http://dict.baidu.com,发现了一个可以值得探讨的一个问题,汉字的编码问题。首先,我们输入一个汉字词语进行搜索,比如,我们,URL上的地址变成http://dict.baidu.com/s?wd=%CE%D2%C3%C7,前面的http://dict.baidu.com/s?wd=就不用管了,都知道是什么意思,我们关注一下后面“%CE%D2%C3%C7”这几个东西。显然是词语“我们”这个的汉字编码。我们知道PHP有个函数urlencode,可以把汉字转换为类似那样行事的。,得到结果为:%E6%88%91%E4%BB%AC。 显然,不是%CE%D2%C3%C7这种格式的。是不是进制的问题呢?还是汉字编码的问题(UTF-8或者GB2312)。我们做一下实验。 我们先进行转码:
发现输出结果都为:%E6%88%91%E4%BB%AC,因为我测试的页面为utf-8的页面。所以结果一样。当页面为GBK或者GB2312的时候结果为:%CE%D2%C3%C7,这样,就和百度上的那个编码一致了。现在我们主要讨论页面编码为UTF8的时候,怎么得到正确的编码。
由于一个汉字为两个字符组成,通过ord()函数获取字符的ASCII值如果大于127时,就可以确定当前字符为一个汉字的前半部分,还需要获取汉字的后半部分。当然,这种判断的方法要结合具体的开发环境,如果存在ASCII值大于127的单个字符,这种方法判断显然就不正确。得到结果为一个数组:
UTF-8的页面结果:
GB2312的页面结果:
从以上结果可以看出,如果页面编码为国标编码的时候,一个汉字是由两个字节组成。而页面编码为UTF8的时候,汉字是由三个字节组成的。但是进制都是十进制的,而我们需要的是十六进制的。那么怎么把十进制的汉字编码转换为十六进制呢?
UTF8下得到结果为:
看到没,成了十六进制了,同理,转换二进制或者八进制只需将dechex函数换成decbin或者decoct就可以了。 接着我们的问题继续,在UTF8页面上实现转换UTF8汉字为十六进制的GBK汉字编码。 以上是分步进行转换,先得到汉字编码的十进制编码,然后我们用进制转换函数得到我们想要的汉字编码。下面我们依然这样做。
现在$w就是我们想要的十进制GBK下的汉字编码了了。
<?php PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在 UTF-8编码下,一个汉字占3个字节)。 采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和 strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载 了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。
实例: 中文,用16进制转换 $string = ","; $length = strlen($string); for($i=0;$i<$length;$i++){ $result[] = '0x' . strtolower(base_convert(ord($string{$i}), 10, 16));//ord($string[$i]); } echo 'chr(' . implode(') . chr(', $result) . ')';
$tags = str_replace(array(chr(0xa3).chr(0xac), chr(0xa1).chr(0x41), chr(0xef).chr(0xbc).chr(0x8c)), ',', censor($tags));
|
2022-08-17
2022-11-06
2022-07-30
2022-08-17
2022-08-15
请发表评论