PHP解决json_encode中文UNICODE转码问题(汇总)

什么是json_encode中文UNICODE转码问题?
先看下边的小列子

<?php
echo json_encode("中文");
//输出:  "\u4e2d\u6587"

在使用 json_encode() 函数将变量转义成json字符串的时候,由于json_encode()仅支持中文。
json_encode()函数会将中文转成utf-8的UNICODE编码。也就是大家看到的“\uxxxx”代表一个中文汉字的形式。

如何能让PHP更好的支持中文呢?
PHP5.4开始,给 json_encode() 增加了第二个参数 JSON_UNESCAPED_UNICODE 这样就可以很好的支持中文了,中文不会在被转义成 “\uxxxx” 的形式。

<?php
echo json_encode("中文", JSON_UNESCAPED_UNICODE);
//输出: "中文"

JSON_UNESCAPED_UNICODE 常量对应的 JSON_UNESCAPED_UNICODE => 256
以上代码还可以写成

<?php
echo json_encode("中文", 256 );
//输出: "中文"

PHP5.4 为json_encode() 函数增加了 JSON_UNESCAPED_UNICODE 参数,很好的解决了中文显示的问题。他还增加了:
JSON_BIGINT_AS_STRING,
JSON_PRETTY_PRINT,
JSON_UNESCAPED_SLASHES
等选项, 如果有兴趣, 大家可以参看: json_encode

———–华丽的分割线—–PHP老版本兼容问题——–
PHP5.4 增加了 JSON_UNESCAPED_UNICODE 参数 为 变量转json字符串的中文支持提供了更好的支持。
那么老版本的PHP如何更好的支持中文呢?
总体上有2个思路
思路一:
    1.在json_encode() 之前,先把中文用urlencode()函数转url编码( 中文变成%XXX的形式了)。
    2.在json_encode() 之后,把url编码的中文利用urldecode()函数转成中文。
示例代码:

$array = array(
'test'=>urlencode("中文")
);
$array = json_encode($array);
echo urldecode($array);
//输出:{"test":"中文"} 

思路二:  先json_encode()在解决中文UNICODE转码问题。你需要一个UNICODE转码转中文函数:

function decodeUnicode($str)
{
    return preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
        create_function(
            '$matches',
            'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'
        ),
        $str);
}

有了这个函数后,你就可以这样做了 :

$arr = array('name1':"中文",'name2':'abc12');
$jsonstr = decodeUnicode(json_encode($arr));//先转json ,再处理中文UNICODE转码问题

当然,你可以将上边两步封装成一步,直接封装一个 json_encode_ex();函数。

/**
* 对变量进行 JSON 编码
* @param mixed value 待编码的 value ,除了resource 类型之外,可以为任何数据类型,该函数只能接受 UTF-8 编码的数据
* @return string 返回 value 值的 JSON 形式
*/
function json_encode_ex($value) {
    if (version_compare(PHP_VERSION, '5.4.0', '<')) {
        $str = json_encode($value);
        $str = preg_replace_callback("#\\\u([0-9a-f]{4})#i",
        function($matchs) {
            return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1]));
        },
        $str);
        return $str;
    } else {
        return json_encode($value, JSON_UNESCAPED_UNICODE);
    }
}

发表评论

邮箱地址不会被公开。 必填项已用*标注