json_encode中文unicode的问题

背景:

近期做微信卡券开发遇到一个问题,创建卡券post数据给服务器时返回data format error, do NOT use json unicode encode (\uxxxx\uxxxx), please use utf8 encoded text!。这就奇怪了,代码中一直用的是UTF-8,怎么就跟unicode搭上关系了呢?一通搜索后发现,用PHP的json_encode来处理中文的时候,中文都会被编码,变成不可读的, 类似\u***的格式,微信服务器端不能接受。

1
2
3
4
$a = array('str1' => '中文', 'str2' => 'english');
var_dump(json_encode($a));
//string(40) "{"str1":"\u4e2d\u6587","str2":"english"}"

解决方法:

法一:

把汉字先urlencode然后再使用json_encode,json_encode之后再次使用urldecode来解码,这样编码出来的json数组中的汉字就不会出现unicode编码了。

1
2
3
4
$a = array('str1' => urlencode('中文'), 'str2' => 'english');
var_dump(urldecode(json_encode($a)));
//string(34) "{"str1":"中文","str2":"english"}"
法二:

PHP 5.4中对json_encode对options可选参数增加JSON_UNESCAPED_UNICODE常量,即不编码为unicode

1
2
3
4
$a = array('str1' => '中文', 'str2' => 'english');
var_dump(json_encode($a, JSON_UNESCAPED_UNICODE));
//string(34) "{"str1":"中文","str2":"english"}"
Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>