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

PHP 字元編碼轉換:GB2312/GBK 轉 UTF-8 完整指南與坑點避雷

     編輯:PHP 相關知識

核心函數對比

函數擴展需求效能特點
iconv()iconv (內建)高支援 //IGNORE、//TRANSLIT 後綴,處理非法字元彈性大
mb_convert_encoding()mbstring低可自動偵測多種來源編碼,適合不確定來源編碼場景

常見問題與解決方案

1. iconv 轉換「—」破折號失敗

GB2312 不含該字元,導致截斷。解法:加 //IGNORE 忽略或預先替換。

$utf8 = iconv('GB2312', 'UTF-8//IGNORE', $gbkStr);

2. mb_detect_encoding 偵測不準

短字串易誤判。建議:指定候選清單、優先順序。

$encoding = mb_detect_encoding($str, ['UTF-8','GBK','GB2312','ASCII'], true);

3. 開頭高位元組導致 iconv 回傳空字串

如 chr(254).'測試'。解法:預先清理或改用 mb_convert_encoding。

通用轉 UTF-8 函式

function toUtf8($str) {
    if (empty($str)) return $str;
    $enc = mb_detect_encoding($str, ['UTF-8','GBK','GB2312','ASCII'], true);
    if ($enc && strtoupper($enc) !== 'UTF-8') {
        // CP936 為 GBK 別名
        $enc = ($enc === 'CP936') ? 'GBK' : $enc;
        $str = iconv($enc, 'UTF-8//IGNORE', $str);
    }
    return $str;
}

陣列/物件遞迴轉碼

function deepConvert($data, $to = 'UTF-8') {
    if (is_array($data)) {
        foreach ($data as $k => $v) $data[$k] = deepConvert($v, $to);
    } elseif (is_object($data)) {
        foreach ($data as $k => $v) $data->$k = deepConvert($v, $to);
    } else {
        $from = mb_detect_encoding($data, ['UTF-8','GBK','GB2312','ASCII'], true);
        if ($from && strtoupper($from) !== strtoupper($to)) {
            $data = mb_convert_encoding($data, $to, $from);
        }
    }
    return $data;
}

最佳實踐建議

  1. 專案統一使用 UTF-8(資料庫 utf8mb4、HTML <meta charset="utf-8">、PHP default_charset)
  2. 輸入端(表單、API)統一 toUtf8() 清洗
  3. 輸出端僅需設定正確 Header,不再轉碼
  4. 避免混用 iconv 與 mb_*,統一封裝工具類
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved