近期做微信卡券开发遇到一个问题,创建卡券post数据给服务器时返回 data format error, do NOT use json unicode encode (\uxxxx\uxxxx), please use utf8 encoded text!。这就奇怪了,代码中一直用的是UTF-8,怎么就跟unicode搭上关系了呢。一通搜索后发现,用PHP的 json_encode 来处理中文的时候,中文都会被编码,变成不可读的, 类似”\u***”的格式,微信服务器端不能接受。
$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编码了。
$a = array('str1' => urlencode('中文'), 'str2' => 'english');
var_dump(urldecode(json_encode($a)));
//string(34) "{"str1":"中文","str2":"english"}"
如果是多维数组就用一个递归函数
function get_array($arrResult,$arr=array()){
foreach($arrResult as $key=>$value){
if (is_array($value)){
$arr[$key]=get_array($value);
}else {
//echo $arrResult[$key]."gg";
$arr[$key]=urlencode($value);
// echo $key;
}
}
return $arr;
}
foreach($arrResult as $key=>$value){
if (is_array($value)){
$arr[$key]=get_array($value);
}else {
//echo $arrResult[$key]."gg";
$arr[$key]=urlencode($value);
// echo $key;
}
}
return $arr;
}
//$menuarr是一个多维数组
$post=urldecode (json_encode(get_array($menuarr)));
法二:
PHP 5.4中对json_encode对options可选参数增加 JSON_UNESCAPED_UNICODE常量,即不编码为unicode
$a = array('str1' => '中文', 'str2' => 'english');
var_dump(json_encode($a, JSON_UNESCAPED_UNICODE));
//string(34) "{"str1":"中文","str2":"english"}"