近期做微信卡券開發遇到一個問題,創建卡券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"}"
如果是多維數組就用一個遞歸函數
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;
}
法二:
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"}"