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

PHP json_encode/json_decode 中文 NULL/亂碼終極解決:UTF-8 強制要求與 urlencode 過渡方案

     編輯:PHP 相關知識

核心規則

json_encode/json_decode 僅支持 UTF-8 編碼字符串。輸入 GBK/GB2312 等非 UTF-8 編碼會導致中文變為 null 或空字符串。

現象演示

$arr = ['name' => '中文'];
echo json_encode($arr); // {"name":null} 或 {"name":""}

解決方案對比

方案一:預處理轉 UTF-8(推薦)

function to_utf8($val) {
    if (is_array($val)) {
        foreach ($val as $k => $v) $val[$k] = to_utf8($v);
        return $val;
    }
    $encoding = mb_detect_encoding($val, ['ASCII','UTF-8','GBK','GB2312','BIG5']);
    return ($encoding && $encoding !== 'UTF-8') ? iconv($encoding, 'UTF-8', $val) : $val;
}

$arr = to_utf8($arr);
echo json_encode($arr); // {"name":"中文"}

方案二:urlencode 過渡法(兼容舊項目、無需 mbstring)

function json_encode_chinese($data) {
    // 遞歸 urlencode 所有值
    array_walk_recursive($data, function(&$v) { $v = urlencode($v); });
    $json = json_encode($data);
    return urldecode($json);
}

$arr = ['name' => '中文'];
echo json_encode_chinese($arr); // {"name":"中文"}

原理:urlencode 將中文轉為 %E4%B8%AD%E6%96%87(ASCII 安全字符),json_encode 安全處理,最後 urldecode 還原。

方案三:升級 PHP 5.4+ 使用 JSON_UNESCAPED_UNICODE

echo json_encode($arr, JSON_UNESCAPED_UNICODE); // 直接輸出中文,不轉 \uXXXX

前提:輸入**必須已是 UTF-8**。

前端接收注意

  • JavaScript JSON.parse() 原生支持 UTF-8。
  • AJAX 返回 Content-Type: application/json; charset=UTF-8。
  • 避免使用 eval(),安全風險高。

完整工具函數

function json_encode_safe($data, $options = 0) {
    if (PHP_VERSION_ID >= 50400) {
        $options |= JSON_UNESCAPED_UNICODE;
    }
    // 確保輸入 UTF-8
    array_walk_recursive($data, function(&$v) {
        if (is_string($v)) {
            $enc = mb_detect_encoding($v, 'UTF-8, GBK, GB2312, BIG5, ASCII');
            if ($enc && $enc !== 'UTF-8') $v = iconv($enc, 'UTF-8', $v);
        }
    });
    return json_encode($data, $options);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved