在編碼轉換專案中,常遇到 iconv() 處理 GB2312 轉 UTF-8 時內容莫名截斷,並拋出 Notice: iconv(): Detected an illegal character in input string。本文深入剖析原因並提供最佳實踐解法。
采集 GB2312 編碼網頁,使用 iconv('GB2312', 'UTF-8', $content) 轉碼。測試初期正常,後發現特定頁面內容被截斷,Apache 錯誤日誌出現非法字元警告。
查閱 PHP 官方文檔發現:iconv 預設行為遇到無法在目標編碼表示的字元時,會從該字元開始截斷後續所有內容,並觸發 E_NOTICE。這是導致資料遺失的主因。
<?php
// 錯誤寫法:遇到非法字元直接截斷
$content = iconv('GB2312', 'UTF-8', $content);
// 正確寫法:忽略無法轉換的字元,保留後續內容
$content = iconv('GB2312', 'UTF-8//IGNORE', $content);
?>
| 旗標 | 行為 | 適用場景 |
|---|---|---|
//TRANSLIT | 嘗試用相似字元替代(如全形轉半形) | 需保留字意近似度的顯示場景 |
//IGNORE | 直接丟棄無法轉換字元,不截斷後續內容 | 資料完整性優先,容忍少量字元遺失 |
| 無旗標(預設) | 遇非法字元即刻截斷並報錯 | 嚴格驗證編碼純度的場景 |
UTF-8(含連字號),部分系統 UTF8 會失效mb_check_encoding() 或 mb_detect_encoding() 確認來源編碼mb_convert_encoding(),支援更多編碼且效能更佳採用 //IGNORE 後,采集系統穩定運行,不再出現內容莫名截斷的情況。