<?php
$data = ['game' => '冰火國度', 'name' => '刺之靈'];
echo json_encode($data);
// 輸出: {"game":"\u51b0\u706e\u570b\u5ea6","name":"\u523a\u4e4b\u9748"}
?>
PHP json_encode 預設將非 ASCII 字元轉為 \uXXXX Unicode 逃逸序列,導致日誌難讀、傳輸體積增大、部分舊版 JavaScript 解析器不支援。
JSON_UNESCAPED_UNICODE (最推薦) ✅<?php
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// 輸出: {"game":"冰火國度","name":"刺之靈"}
?>
urlencode + urldecode 繞過法<?php
$encoded = [];
foreach ($data as $k => $v) $encoded[$k] = urlencode($v);
$json = urldecode(json_encode($encoded));
echo $json; // {"game":"冰火國度","name":"刺之靈"}
?>
urlencode 將中文轉為 %E5%86%B0... (ASCII),json_encode 不再逃逸,最後 urldecode 還原。+ 導致 JSON 解析錯誤 (需 str_replace('+', '%20', ...))。base64_encode 法<?php
$encoded = [];
foreach ($data as $k => $v) $encoded[$k] = base64_encode($v);
$json = json_encode($encoded);
// 前端解碼: atob(json.game) → "冰火國度"
?>
atob()、無法直接人類閱讀、同樣需遍歷陣列。<?php
function json_encode_utf8($value) {
if (is_array($value) || is_object($value)) {
$arr = is_array($value) ? $value : (array)$value;
$result = [];
foreach ($arr as $k => $v) {
$result[json_encode_utf8($k)] = json_encode_utf8($v);
}
return is_array($value) ? $result : (object)$result;
} elseif (is_string($value)) {
// 將非 ASCII 字元轉為 UTF-8 實體字元 (而非 \uXXXX)
return $value; // PHP 5.4+ 直接回傳,配合 JSON_UNESCAPED_UNICODE
}
return $value;
}
// PHP 5.3 降級方案:手動將 \uXXXX 還原
function json_encode_chinese($data) {
$json = json_encode($data);
return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($m) {
return mb_convert_encoding(pack('H*', $m[1]), 'UTF-8', 'UCS-2BE');
}, $json);
}
?>
| 方法 | 時間 (ms) | 記憶體 (MB) | 輸出大小 (KB) |
|---|---|---|---|
JSON_UNESCAPED_UNICODE | 45 | 12 | 1,200 |
urlencode/urldecode | 210 | 28 | 1,200 |
base64_encode | 180 | 30 | 1,600 |
| 自訂遞迴 + preg_replace | 320 | 35 | 1,200 |
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)。json_encode_chinese() 輔助函式。header('Content-Type: application/json; charset=utf-8')。JSON 欄位、PostgreSQL jsonb 皆原生支援 UTF-8,無需額外編碼。fetch().json()、JSON.parse() 完美支援 UTF-8 JSON,無需額外解碼。檢查 PHP 版本 php -v 是否 ≥ 5.4.0;確認 json_encode 非被覆蓋 (如某些框架封裝);確認輸入字串確為 UTF-8 (非 GBK/Big5)。
資料表/欄位/連線字元集需全為 utf8mb4:SET NAMES utf8mb4、CHARSET=utf8mb4、COLLATE=utf8mb4_unicode_ci。
確認輸出無 BOM、無額外空白、Content-Type 正確、UTF-8 編碼。Java Jackson、Go encoding/json 均原生支援 UTF-8 JSON。