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

PHP 字串編碼偵測與轉換:從 iconv 到 mbstring 的最佳實踐

     編輯:PHP 綜合知識

基礎轉換:iconv

$utf8 = iconv('GBK', 'UTF-8//IGNORE', $gbk_str);
// //IGNORE 會忽略無法轉換的字元,避免報錯中斷

編碼偵測的陷阱

mb_detect_encoding() 常誤判(尤其短字串、純 ASCII 兼容字元)。

// 不可靠
$enc = mb_detect_encoding($str, ['GBK', 'UTF-8', 'BIG5']);

穩健偵測策略:利用 iconv 往復驗證

原理:若字串已是某編碼,用該編碼「轉向同編碼」應保持不變。

function detect_encoding($str, $candidates = ['UTF-8', 'GBK', 'BIG5']) {
    foreach ($candidates as $enc) {
        // 嘗試將 $str 視為 $enc 轉為 $enc,若結果相同則極大機率是 $enc
        $converted = @iconv($enc, $enc . '//IGNORE', $str);
        if ($converted !== false && $converted === $str) {
            return $enc;
        }
    }
    return false; // 無法判斷
}

完整轉換流程範例

function to_utf8($str) {
    $enc = detect_encoding($str);
    if (!$enc) {
        // 最後嘗試:假設為 UTF-8,若失敗則原樣返回
        return $str;
    }
    if ($enc !== 'UTF-8') {
        $str = iconv($enc, 'UTF-8//IGNORE', $str);
    }
    return $str;
}

進階:使用 intl 擴展的 Normalizer

PHP intl 擴展提供 Unicode 正規化,處理全形/半形、組合字元等:

$normalized = Normalizer::normalize($utf8_str, Normalizer::FORM_KC);

效能提示

  • iconv 為 C 層實現,速度快於 mb_convert_encoding。
  • 大量資料轉換時,避免在迴圈中重複偵測編碼,應先抽樣判斷整批資料編碼。
  • 資料庫連線層設定 SET NAMES utf8mb4,儲存層面直接統一 UTF-8,減少應用層轉碼。

常見編碼對照表

編碼名稱iconv 識別名適用場景
UTF-8UTF-8現代 Web 標準
GBK / GB2312GBK / GB2312中文舊系統、Windows 內建
BIG5BIG5繁體中文舊系統
ISO-8859-1ISO-8859-1西歐語系、早期 HTTP 預設
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved