PHP 5.2 版本起引入 json_encode() 與 json_decode(),可實現陣列與 JSON 字串互轉。但預設情況下,中文字符會被轉為 Unicode 轉義序列(如 \u4e2d\u6587),導致可讀性差且傳輸體積增大。
透過正則替換將 Unicode 轉義序列還原為 UTF-8 字符,可實現中文友好的 JSON 輸出:
<?php
class Json_Helper {
/**
* 生成支援中文的 JSON
*/
public static function encode($data) {
$json = json_encode($data);
// Linux 環境下轉換
return preg_replace("#\\\u([0-9a-f]{4})#ie", "iconv('UCS-2BE', 'UTF-8', pack('H4', '\\1'))", $json);
// Windows 環境請使用下行註釋代碼
// return preg_replace("#\\\u([0-9a-f]{4})#ie", "iconv('UCS-2LE', 'UTF-8', pack('H4', '\\1'))", $json);
}
/**
* 解析 JSON(直接使用內建函數)
*/
public static function decode($jsonStr) {
return json_decode($jsonStr);
}
}
?>
#\\\u([0-9a-f]{4})#ie 匹配 Unicode 轉義序列$arr = ['name' => '張三', 'city' => '北京'];
$json = Json_Helper::encode($arr);
// 輸出: {"name":"張三","city":"北京"} 而非 {"name":"\u5f20\u4e09","city":"\u5317\u4eac"}
$data = Json_Helper::decode($json);
// 正常解析為 PHP 陣列
PHP 5.4+ 版本的 json_encode() 新增 JSON_UNESCAPED_UNICODE 選項,可直接輸出中文:json_encode($data, JSON_UNESCAPED_UNICODE)。若環境允許,建議優先使用內建選項,性能更優且無需額外處理。