解决json_encode中文UNICODE转码问题

来源:互联网 发布:四川建院教务网络管理 编辑:程序博客网 时间:2024/05/20 21:21


下面是我查询了网上的解决办法后,自己总结的方法, 如有错误的地方,请你帮忙指正,在此感谢

[使用场景1]  我们将数据经过json_encode()处理后,存进表中

由于, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式,如下所示:

$arr = ['name' => '大霞', 'sex'=>'f'];
$str = json_encode($arr);  //下面的例子,我将使用到此变量
var_dump($str);
 
打印结果如下:
string '{"name":"\u5927\u971e","sex":"f"}'


当我们从数据库表中"取出"数据时,如何将Unicode字符转化成中文,有3种解决办法,此时我将一一列出

方法1:

升级PHP,在PHP5.4, 这个问题终于得以解决, Json新增了一个选项: JSON_UNESCAPED_UNICODE, 故名思议, 就是说, Json不要编码Unicode

$str = json_encode($arr, JSON_UNESCAPED_UNICODE);  //这样我们存进去的是就是中文了,那么取出的也就是中文了
 
打印结果如下:
string '{"name":"大霞","sex":"f"}'


方法2:

对unicode码再进行解码,解码函数如下:
function decodeUnicode($str)
{
    returnpreg_replace_callback('/\\\\u([0-9a-f]{4})/i',
        create_function(
            '$matches',
            'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'
        ),
        $str);
}
$str = json_encode($arr)
$str = decodeUnicode($str);
 
结果如下:
string '{"name":"大霞","sex":"f"}'


方法3:

$str=preg_replace("#\\\u([0-9a-f]{4})#ie","iconv('UCS-2BE', 'UTF-8', pack('H4', '\\1'))",$str);
 
打印结果如下:
string '{"name":"大霞","sex":"f"}'

 

注意:  preg_replace函数已经在php5.5.x版本中废除, 如果你是高版本,将会报错如下(如果你是低版本,此方法仍然可用)

preg_replace(): The /e modifier is deprecated,use preg_replace_callback instead

 

此时我们可以使用preg_replace_callback()来代替, 例子如下所示:

$arr = ['name' => '大霞', 'sex'=> 'f'];
$str = json_encode($arr);
$test = preg_replace_callback('/\\\u([0-9a-f]{4})/',function($match) {
    returniconv('UCS-2BE','UTF-8', pack('H4',$match[1]));   //抓取来的ucs-2编码的信息转码成utf-8格式的
}, $str);
 

说明:  以上3中方法,我觉的方法1是最简单不过的,因为存进表中的是中文形式, 那么我们取出的数据就不用经过任何的处理了, 另外两种方法都是对于那些已经存进表中的Unicode字符进行的处理


[使用场景2] 我们存进表中的汉字先urlencode然后再使用json_encode,将存进表中的数据如下所示

 

$arr = ['name' => urlencode("大霞"),'sex' => 'f'];
$str = json_encode($arr);
var_dump($str);
 
结果如下:
string '{"name":"%E5%A4%A7%E9%9C%9E","sex":"f"}'

 

取出数据的时候,再次使用urldecode来解码,这样编码出来的json数组中的汉字就不会出现unicode编码了。

$str = urldecode($str);
 
打印结果如下:
string '{"name":"大霞","sex":"f"}'

说明: 这种方法不是简单的方法, 在此仅仅是说明有此种方法而已,并不推荐使用


 

上面可能用到一些函数:

 

说明一下其他用到的函数:pack() 函数把数据装入一个二进制字符串。      语法 : pack(format,args+)         format   必需。规定在包装数据时所使用的格式。  args+  可选。规定被包装的一个或多个参数。iconv()函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库。      例如: $string = "大霞";           iconv("utf8","gbk",$string)//将字符串string            编码由utf8转变成gbk;

0 0
原创粉丝点击