什么是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); } }