PHP json_encode 對中文預設輸出 Unicode 轉義 (`\uXXXX`),導致不可讀、多維陣列遞歸處理麻煩、換行符破壞 JSON 結構、中文鍵名同樣被轉義。本文提供通用 `_encode` 函數一勞永逸。
function _encode($arr) {
$norm = array();
foreach ($arr as $k => $v) {
$norm[_urlencode($k)] = _urlencode($v); // 遞歸 urlencode 鍵值
}
// json_encode 後 urldecode 還原,addcslashes 保護換行符
return addcslashes(urldecode(json_encode($norm)), "\r\n");
}
function _urlencode($elem) {
if (is_array($elem)) {
$norm = array();
foreach ($elem as $k => $v) {
$norm[_urlencode($k)] = _urlencode($v);
}
return $norm;
}
return urlencode($elem); // 純量值 urlencode
}
$data = [
'中文鍵' => '包含換行
內容',
'list' => ['項目1', '項目2', ['巢狀' => '值']],
'正常' => '正常值'
];
echo _encode($data);
// 輸出: {"中文鍵":"包含換行\n內容","list":["項目1","項目2",{"巢狀":"值"}],"正常":"正常值"}
// 可讀、無 Unicode 轉義、換行保留為 \n、中文鍵名完美保留
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP)
// JSON_UNESCAPED_UNICODE 直接保留中文,無需 urlencode 技巧
// 但舊版本 (5.3-) 無此常數,_encode 兼容性更好