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

PHP json_encode 中文/多維陣列/換行/中文鍵名完美解決方案:urlencode 雙重編碼法

     編輯:Java 相關知識

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、中文鍵名完美保留

原理解析

  1. **雙重 urlencode**:鍵與值先 `urlencode` → 中文/特殊字符變 `%XX` 形式,**JSON 編碼時視為安全 ASCII 字符,不再轉義**。
  2. **遞歸處理**:陣列/物件層層 `urlencode`,確保深層中文同樣受保護。
  3. **urldecode 還原**:`json_encode` 完成後,整體 `urldecode` 將 `%XX` 還原為真實字符。
  4. **addcslashes 保護換行**:防止原始換行符 (`\r\n`) 直接出現在 JSON 字串中導致解析錯誤,轉義為 `\r\n` 字面量。

現代 PHP (5.4+) 替代方案

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 兼容性更好
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved