解決 PHP iconv() 在中文編碼轉換(如 UTF-8 → GB2312)時遇到無法轉換字元導致輸出截斷的問題:使用 //IGNORE 忽略錯誤字元,或改用 mb_convert_encoding() 獲得更穩健的多編碼支援。
<?php
$data = "包含特殊字元的字串…";
$result = iconv("UTF-8", "GB2312", $data);
// 若 $data 含 GB2312 無法表示的字元,iconv 會在該位置停止,回傳不完整字串
?>
<?php
$result = iconv("UTF-8", "GB2312//IGNORE", $data);
// 無法轉換的字元會被靜默丟棄,不中斷流程
?>
目標編碼//IGNORE(雙斜線)。<?php
// 基本用法:指定來源與目標編碼
$str = mb_convert_encoding($str, "SJIS"); // 內部編碼 → SJIS
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP"); // EUC-JP → UTF-7
// 多來源編碼自動偵測
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");
// auto 自動偵測順序:ASCII, JIS, UTF-8, EUC-JP, SJIS
$str = mb_convert_encoding($str, "EUC-JP", "auto");
?>
| 特性 | iconv | mb_convert_encoding |
|---|---|---|
| 編碼支援 | 依系統 libiconv | 內建支援 100+ 編碼 |
| 自動偵測來源編碼 | 不支援 | 支援 "auto" 或陣列列舉 |
| 錯誤處理 | //IGNORE, //TRANSLIT | 預設替換字元,可設定 mb_substitute_character() |
| 效能 | 較快(C 底層) | 略慢(PHP 層封裝) |
| 可移植性 | 需系統安裝 libiconv | PHP 內建擴展,較一致 |
mb_convert_encoding(),編碼支援更完整、行為一致。iconv 代碼快速修正:加上 //IGNORE 避免截斷崩潰。// 繁體中文
Big5, Big5-HKSCS, CP950
// 簡體中文
GB2312, GBK, GB18030, CP936
// 日文
SJIS, EUC-JP, CP932, JIS
// Unicode
UTF-8, UTF-16, UTF-32, UCS-2, UCS-4
選對編碼轉換工具並妥善處理例外字元,是多語言系統穩定運行的關鍵基礎設施。