PHP 5.4+ 版本原生支持 JSON_UNESCAPED_UNICODE 參數,可直接輸出中文字符而非 Unicode 轉義序列。但早期版本(PHP 5.3 及以下)需自行處理。本文介紹一種基於正則替換的通用方案。
json_encode() 會將非 ASCII 字符編碼為 \uXXXX 格式。利用正則匹配這些轉義序列,再通過 pack() 和 iconv() 還原為 UTF-8 字符。
/**
* 不轉義中文字符的 JSON 編碼(兼容 PHP 5.3-)
* @param array $arr 待編碼數據
* @return string JSON 字符串
*/
function jsonEncodeChinese($arr) {
$json = json_encode($arr);
// 匹配 \uXXXX 格式,捕獲十六進制碼點
$pattern = '/\\\\u([0-9a-f]{4})/i';
$callback = function ($matches) {
// 將十六進制轉為二進制,再由 UCS-2BE 轉 UTF-8
return iconv('UCS-2BE', 'UTF-8', pack('H4', $matches[1]));
};
return preg_replace_callback($pattern, $callback, $json);
}
/\\\\u([0-9a-f]{4})/i 匹配標準 JSON Unicode 轉義序列,捕獲 4 位十六進制碼點。/e 修飾符更安全、性能更好(PHP 5.3+ 推薦)。$data = ['name' => '張三', 'city' => '北京'];
echo jsonEncodeChinese($data);
// 輸出: {"name":"張三","city":"北京"}
// 而非: {"name":"\u5f20\u4e09","city":"\u5317\u4eac"}
若項目已升級至 PHP 5.4+,請直接使用原生參數:
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
此方案僅供維護舊版本項目時參考,新項目請優先使用原生功能。