json_encode 預設將中文編碼為 \uXXXX,雖標準但增加傳輸體積。本文提供三種輸出原始中文的方案,並解決非 UTF-8 編碼導致 null 的問題。
$array = ['test' => urlencode("我是測試")];
$json = json_encode($array);
echo urldecode($json); // {"test":"我是測試"}
urlencode 將中文轉為 %XX%XX,json_encode 不轉義 ASCII,最後 urldecode 還原。JSON_UNESCAPED_UNICODE 選項echo json_encode($array, JSON_UNESCAPED_UNICODE); // 直接輸出中文
function my_json_encode($data) {
if (is_array($data)) {
foreach ($data as $k => $v) $data[$k] = my_json_encode($v);
return $data;
} elseif (is_string($data)) {
return urlencode($data);
}
return $data;
}
echo urldecode(json_encode(my_json_encode($array)));
當輸入字符串非 UTF-8(如抓取 GBK 頁面)時,json_encode 會返回 null。解決:
$utf8_str = iconv('GBK', 'UTF-8', $original_str);
echo json_encode($utf8_str);
修改 cmd 移除 native2ascii 步驟,並設置 charset=UTF-8,可避免中文轉 Unicode 導致體積膨脹,且無需 JDK 僅需 JRE 即可運行。
選擇建議:現代項目首選 JSON_UNESCAPED_UNICODE;舊版本或需兼容性時用方案一。