<?php /** * 把一个汉字转为unicode的通用函数,不依赖任何库,和别的自定义函数,但有条件 * 条件:本文件以及函数的输入参数应该用utf-8编码,不然要加函数转换 * 其实亦可轻易编写反向转换的函数,甚至不局限于汉字,奇怪为什么PHP没有现成函数 * @author xieye * * @param {string} $word 必须是一个汉字,或代表汉字的一个数组(用str_split切割过) * @return {string} 一个十进制unicode码,如4f60,代表汉字 “你” * * @example echo "你 ".getUnicodeFromOneUTF8("你"); echo "<br />"; echo "好 ".getUnicodeFromOneUTF8("好"); echo "<br />"; echo "你好 ".getUnicodeFromOneUTF8("你好"); echo "<br />"; echo "你好吗 ".getUnicodeFromOneUTF8("你好吗"); 你 20320 好 22909 你好 251503099357000 你好吗 4.21952182258E+21 */ function getUnicodeFromOneUTF8($word) { //获取其字符的内部数组表示,所以本文件应用utf-8编码! if (is_array( $word)) $arr = $word; else $arr = str_split($word); //此时,$arr应类似array(228, 189, 160) //定义一个空字符串存储 $bin_str = ''; //转成数字再转成二进制字符串,最后联合起来。 foreach ($arr as $value) $bin_str .= decbin(ord($value)); //此时,$bin_str应类似111001001011110110100000,如果是汉字"你" //正则截取 $bin_str = preg_replace('/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/','$1$2$3', $bin_str); //此时, $bin_str应类似0100111101100000,如果是汉字"你" return bindec($bin_str); //返回类似20320, 汉字"你" //return dechex(bindec($bin_str)); //如想返回十六进制4f60,用这句 } echo "你 ".getUnicodeFromOneUTF8("你"); echo "<br />"; echo "好 ".getUnicodeFromOneUTF8("好"); echo "<br />"; echo "你好 ".getUnicodeFromOneUTF8("你好"); echo "<br />"; echo "你好吗 ".getUnicodeFromOneUTF8("你好吗"); exit; ?>
方法一
<?php //汉字转换为16进制编码 function hexEncode($s) { return preg_replace('/(.)/es',"str_pad(dechex(ord('\\1')),2,'0',STR_PAD_LEFT)",$s); }
//16进制编码转换为汉字 function hexDecode($s) { return preg_replace('/(\w{2})/e',"chr(hexdec('\\1'))",$s); } echo hexDecode(hexEncode("北京欢迎您!")); ?>
——————————————————————————————————————————
方法二
echo rawurlencode("北京欢迎您").'<br>';
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。
解码用:rawurldecode
——————————————————————————————————————————
方法三及原理
GBK版:
GBK编码中一个汉字由二个字符组成,
通过ord()函数获取字符的ASCII值如果大于127时,就可以确定当前字符为一个汉字的前半部分,还需要获取汉字的后半部分。当然,这种判断的方法要结合具体的开发环境,如果存在ASCII值大于127的单个字符,这种方法判断显然就不正确。
PHP实现中文字符转十进制的原理就是通过for循环的方法获取一个汉字的二个字符,然后使用ord()函数把各字符转换为十进制。如上分别是:不 [178 187] 要 [210 170] 迷 [195 212] 恋 [193 181] 哥 [184 231]
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); echo '<br>'; //十六进制 $strings = array(); foreach($result as $v){ $dec = explode(" ",$v); $strings[] = dechex($dec[0])." ".dechex($dec[1]); } var_dump($strings);
UTF-8版:
$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]).' '.ord($string[++$i]); } } var_dump($result); echo '<br>'; //十六进制 $strings = array(); foreach($result as $v){ $dec = explode(" ",$v); $strings[] = dechex($dec[0])." ".dechex($dec[1])." ".dechex($dec[2]); } var_dump($strings);
|