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

PHP 自動偵測字串編碼並轉換為 UTF-8 通用函式

     編輯:PHP 相關知識

應用場景

整合舊系統、爬蟲資料、使用者上傳檔案時,字串編碼可能為 UTF-8、Big5、GBK、Latin1 等混雜。直接輸出或存入資料庫易產生亂碼。需一個函式自動偵測並統一轉為 UTF-8。

核心函式

function to_utf8($data) {
    if (empty($data)) return $data;

    // 偵測編碼(依優先順序)
    $encoding = mb_detect_encoding($data, ['UTF-8', 'GBK', 'BIG5', 'LATIN1'], true);

    // 若偵測失敗或已是 UTF-8,直接返回
    if ($encoding === false || $encoding === 'UTF-8') {
        return $data;
    }

    // 轉換為 UTF-8
    return mb_convert_encoding($data, 'UTF-8', $encoding);
}

進階版:支援陣列與物件遞迴轉換

function to_utf8_deep($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[$key] = to_utf8_deep($value);
        }
        return $data;
    } elseif (is_object($data)) {
        foreach ($data as $key => $value) {
            $data->$key = to_utf8_deep($value);
        }
        return $data;
    } elseif (is_string($data)) {
        return to_utf8($data);
    }
    return $data;
}

使用範例

// 單一字串
$str = file_get_contents('gbk_encoded.txt');
$utf8Str = to_utf8($str);

// $_POST 批次轉換
$_POST = to_utf8_deep($_POST);

// 資料庫查詢結果轉換
$results = $db->query('SELECT * FROM old_table')->fetchAll();
$results = to_utf8_deep($results);

注意事項與限制

  • mbstring 擴充套件必須啟用:php -m | grep mbstring 確認。
  • 偵測非 100% 準確:短字串、純 ASCII 字元無法可靠偵測。建議在明確知道來源編碼時直接指定 mb_convert_encoding($str, 'UTF-8', 'GBK')。
  • 效能考量:大量資料轉換建議在資料庫層面(如 SET NAMES utf8mb4)或匯入前批次處理,避免每請求執行偵測。
  • BOM 處理:UTF-8 with BOM 會導致偵測偏差,可先 str_replace("\xEF\xBB\xBF", '', $data) 移除。

替代方案比較

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點
mb_detect_encoding + mb_convert_encoding原生、無相依、支援主流編碼短字串偵測不可靠
iconv()支援更多編碼、可忽略錯誤字元需指定來源編碼、語法較繁瑣
UConverter (intl 擴充)ICU 庫支援、偵測更精準需安裝 intl 擴充、記憶體較大
強制指定編碼效能最好、零誤判需確定來源編碼