我們知道, 用PHP的json_encode來處理中文的時候, 中文都會被編碼, 變成不可讀的, 類似”\u***”的格式, 還會在一定程度上增加傳輸的數據量.
在數據傳輸的時候不要加
但是在寫入日志的時候,加上 方便直接查看中文
header('Content-Type: application/json');
echo json_encode($arrResponse);
//返回值日志
Bd_Log::addNotice('bcp_response', json_encode($arrResponse, JSON_UNESCAPED_UNICODE));
<?php
echo json_encode("中文"); //Output: "\u4e2d\u6587"
這就讓我們這些在天朝做開發的同學, 很是頭疼, 有的時候還不得不自己寫json_encode.
?>
而在PHP5.4, 這個問題終於得以解決, Json新增了一個選項: JSON_UNESCAPED_UNICODE, 故名思議, 就是說, Json不要編碼Unicode.
看下面的例子:
<?php
echo json_encode("中文", JSON_UNESCAPED_UNICODE); //Output: "中文"
怎么樣, 是不是讓大家很開心的改動?
呵呵, 當然, Json在5.4還加入了: JSON_BIGINT_AS_STRING, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES等選項, 如果有興趣, 大家可以參看: json_encode
其中有2個比較常用到的參數
JSON_UNESCAPED_UNICODE(中文不轉為unicode ,對應的數字 256)
JSON_UNESCAPED_SLASHES (不轉義反斜杠,對應的數字 64)
通常json_encode只能傳入一個常量,如果同時使用2個常量怎么辦?
JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES = 320
使用方法:json_encode($arr,320);即可完成同時使用2個常量。
PHP5.4才支持JSON_UNESCAPED_UNICODE這個參數,此參數是讓中文字符在json_encode的時候不用轉義,減少數據傳輸量。但在PHP5.3中,就得自己寫個函數來實現,以下就是解決方法:
/**
* 對數組變量進行 JSON 編碼
* @param mixed array 待編碼的 array (除了resource 類型之外,可以為任何數據類型,該函數只能接受 UTF-8 編碼的數據)
* @return string (返回 array 值的 JSON 形式)
*/
function json_encode($array)
{
if(version_compare(PHP_VERSION,'5.4.0','<')){
$str = json_encode($array);
$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($array, JSON_UNESCAPED_UNICODE);
}
}