分享

PHP实现中文汉字与16进制编码转换

 wwwijhyt图书馆 2014-05-09

<?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);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多