| 函數 | 擴展需求 | 效能 | 特點 |
|---|---|---|---|
iconv() | iconv (內建) | 高 | 支援 //IGNORE、//TRANSLIT 後綴,處理非法字元彈性大 |
mb_convert_encoding() | mbstring | 低 | 可自動偵測多種來源編碼,適合不確定來源編碼場景 |
GB2312 不含該字元,導致截斷。解法:加 //IGNORE 忽略或預先替換。
$utf8 = iconv('GB2312', 'UTF-8//IGNORE', $gbkStr);
短字串易誤判。建議:指定候選清單、優先順序。
$encoding = mb_detect_encoding($str, ['UTF-8','GBK','GB2312','ASCII'], true);
如 chr(254).'測試'。解法:預先清理或改用 mb_convert_encoding。
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;
}
utf8mb4、HTML <meta charset="utf-8">、PHP default_charset)toUtf8() 清洗iconv 與 mb_*,統一封裝工具類