iconv("UTF-8", "GB2312", $data) 處理含無法映射字符的字串時,會**靜默截斷**或返回 false,導致數據丟失且難以排查。
iconv("UTF-8", "GB2312//IGNORE", $data); // 忽略無法轉換字符,不報錯不截斷
缺點:靜默丟失字符,無感知,數據完整性無保障。
<?php
/* 轉換內部編碼為 SJIS */
$str = mb_convert_encoding($str, "SJIS");
/* 將 EUC-JP 轉換成 UTF-7 */
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP");
/* 從 JIS, eucjp-win, sjis-win 自動檢測並轉換至 UCS-2LE */
$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() |
|---|---|---|
| 自動偵測來源編碼 | ❌ | ✅ "auto" 或陣列列表 |
| 非法字符處理 | 截斷/報錯 | 可配置替換字符/忽略 |
| 多編碼鏈式轉換 | 需多次調用 | 單次調用支援多來源候選 |
| 支援編碼範圍 | 依賴系統 iconv 庫 | 內建豐富編碼表(mbstring) |
mb_convert_encoding()**iconv(..., "//IGNORE") 可作為輕量備選mbstring.substitute_character 設置替換字符(如 0x3F ?),避免靜默數據損壞