$utf8 = iconv('GBK', 'UTF-8//IGNORE', $gbk_str);
// //IGNORE 會忽略無法轉換的字元,避免報錯中斷
mb_detect_encoding() 常誤判(尤其短字串、純 ASCII 兼容字元)。
// 不可靠
$enc = mb_detect_encoding($str, ['GBK', 'UTF-8', 'BIG5']);
原理:若字串已是某編碼,用該編碼「轉向同編碼」應保持不變。
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;
}
PHP intl 擴展提供 Unicode 正規化,處理全形/半形、組合字元等:
$normalized = Normalizer::normalize($utf8_str, Normalizer::FORM_KC);
iconv 為 C 層實現,速度快於 mb_convert_encoding。SET NAMES utf8mb4,儲存層面直接統一 UTF-8,減少應用層轉碼。| 編碼名稱 | iconv 識別名 | 適用場景 |
|---|---|---|
| UTF-8 | UTF-8 | 現代 Web 標準 |
| GBK / GB2312 | GBK / GB2312 | 中文舊系統、Windows 內建 |
| BIG5 | BIG5 | 繁體中文舊系統 |
| ISO-8859-1 | ISO-8859-1 | 西歐語系、早期 HTTP 預設 |