PHP 5.3 之前 json_encode 會將中文字符轉為 Unicode 轉義序列 (如 \u4e2d\u6587),導致前端直接 alert 顯示亂碼,且傳輸體積增大。
<?php
$json = array(
array('id' => 13, 'name' => '乒乓球'),
array('id' => 17, 'name' => '籃球')
);
$code = json_encode($json);
// 正則替換 Unicode 轉義為 UTF-8 字符
echo preg_replace("#\\\\u([0-9a-f]{4})#ie", "iconv('UCS-2BE', 'UTF-8', pack('H4', '\\1'))", $code);
?>
直接使用 JSON_UNESCAPED_UNICODE 選項,無需任何後處理:
<?php
$json = array(
array('id' => 13, 'name' => '乒乓球'),
array('id' => 17, 'name' => '籃球')
);
// PHP 5.4+ 直接輸出可讀中文
echo json_encode($json, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// 輸出: [{"id":13,"name":"乒乓球"},{"id":17,"name":"籃球"}]
?>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script>
$.getJSON("json.php", function(data) {
$.each(data, function(i, item) {
console.log(item.name); // 正常顯示中文
$('#list').append('<li>' + item.name + '</li>');
});
});
</script>
<ul id="list"></ul>
SET NAMES utf8mb4,mysqli set_charset('utf8mb4')header('Content-Type: application/json; charset=utf-8');JSON_UNESCAPED_LINE_TERMINATORS 保留換行符升級 PHP 5.4+ 並使用 JSON_UNESCAPED_UNICODE 是最簡潔、高效、標準的解決方案。舊版本環境可用正則替換過渡,但強烈建議升級運行環境。