首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 早期版本中實現 JSON 中文不轉義編碼的方法

     編輯:PHP 相關知識

PHP 5.4+ 版本原生支持 JSON_UNESCAPED_UNICODE 參數,可直接輸出中文字符而非 Unicode 轉義序列。但早期版本(PHP 5.3 及以下)需自行處理。本文介紹一種基於正則替換的通用方案。

核心思路

json_encode() 會將非 ASCII 字符編碼為 \uXXXX 格式。利用正則匹配這些轉義序列,再通過 pack() 和 iconv() 還原為 UTF-8 字符。

代碼實現

/**
 * 不轉義中文字符的 JSON 編碼(兼容 PHP 5.3-)
 * @param array $arr 待編碼數據
 * @return string JSON 字符串
 */
function jsonEncodeChinese($arr) {
    $json = json_encode($arr);
    // 匹配 \uXXXX 格式,捕獲十六進制碼點
    $pattern = '/\\\\u([0-9a-f]{4})/i';
    $callback = function ($matches) {
        // 將十六進制轉為二進制,再由 UCS-2BE 轉 UTF-8
        return iconv('UCS-2BE', 'UTF-8', pack('H4', $matches[1]));
    };
    return preg_replace_callback($pattern, $callback, $json);
}

關鍵點解析

  • 正則模式:/\\\\u([0-9a-f]{4})/i 匹配標準 JSON Unicode 轉義序列,捕獲 4 位十六進制碼點。
  • pack('H4', ...):將十六進制字符串轉為 2 字節二進制數據(大端序)。
  • iconv('UCS-2BE', 'UTF-8', ...):將 UCS-2BE 編碼的雙字節字符轉為 UTF-8。
  • preg_replace_callback:比舊版 /e 修飾符更安全、性能更好(PHP 5.3+ 推薦)。

使用示例

$data = ['name' => '張三', 'city' => '北京'];
echo jsonEncodeChinese($data);
// 輸出: {"name":"張三","city":"北京"}
// 而非: {"name":"\u5f20\u4e09","city":"\u5317\u4eac"}

遷移建議

若項目已升級至 PHP 5.4+,請直接使用原生參數:

json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

此方案僅供維護舊版本項目時參考,新項目請優先使用原生功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved