iconv 基礎用法
<?php
// 基本轉換
$str = iconv('UTF-8', 'GBK', '中文測試'); // 返回 GBK 字節串
// 忽略無法轉換字符(推薦生產環境)
$str = iconv('UTF-8', 'GBK//IGNORE', '中文測試●特殊符號');
// 輸出: "中文測試" (●被忽略)
// 近似替換(嘗試找視覺相似字符)
$str = iconv('UTF-8', 'GBK//TRANSLIT', '中文測試●');
// 可能輸出: "中文測試*" 或保留原字符視具體實現
mb_convert_encoding 用法
<?php
// 需啟用 mbstring 擴展
// 單一來源編碼
$str = mb_convert_encoding('中文', 'UTF-8', 'GBK');
// 自動檢測來源編碼(按順序嘗試)
$str = mb_convert_encoding($str, 'UTF-8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS');
// 指定輸出編碼為 Big5
header('Content-Type: text/html; charset=big5');
echo mb_convert_encoding('你好', 'BIG5', 'UTF-8');
核心差異對比
| 特性 | iconv | mb_convert_encoding |
| 性能 | 快(C 底層實現) | 較慢(多編碼檢測開銷) |
| 錯誤處理 | //IGNORE //TRANSLIT 後綴控制 | 默認忽略非法字符,行為不可控 |
| 多源編碼自動識別 | 不支持 | 支持(數組/逗號分隔列表) |
| 依賴庫 | libiconv / glibc | mbstring (PHP 內置) |
| 對「-」轉 GBK Bug | 有(需 //IGNORE 繞過) | 無此問題 |
選型建議
- **明確知道來源編碼、追求性能** →
iconv + //IGNORE。
- **來源編碼不確定(如用戶上傳文件)** →
mb_convert_encoding($str, 'UTF-8', 'auto')。
- **現代項目** → 統一 UTF-8 全鏈路,避免轉碼;必須轉碼時優先
iconv。
常見編碼別名對照
GB2312 = GBK (GBK 是超集)
UTF-8 = UTF8
BIG5 = BIG-5
ISO-8859-1 = LATIN1