iconv 基礎語法
string iconv(string $from_encoding, string $to_encoding, string $string): string|false
關鍵參數://IGNORE 和 //TRANSLIT
| 後綴 | 行為 | 適用場景 |
| 無後綴 | 遇無法轉換字符截斷後續內容 | 嚴格轉換,確保數據純淨 |
| //IGNORE | 忽略無法轉換字符,繼續處理 | 數據清洗、容錯轉換、防截斷 |
| //TRANSLIT | 音譯/近似替換 (如全形→半形) | 保持可讀性、特殊符號處理 |
核心代碼示例
<?php
$str = '你好、這裡是賣咖啡!';
// 基礎轉換
echo iconv('GBK', 'UTF-8', $str); // 正常
echo iconv('UTF-8', 'GBK', $str); // 可能截斷
// 防截斷 (推薦)
echo iconv('UTF-8', 'GBK//IGNORE', $str); // 忽略非法字符
echo iconv('UTF-8', 'GBK//TRANSLIT', $str); // 近似替換
// 獲取編碼信息
print_r(iconv_get_encoding()); // 所有編碼設置
// 字符長度 (按字符非字節)
echo iconv_strlen($str, 'UTF-8'); // 12
// 字符截取 (按字符)
echo iconv_substr($str, 1, 3, 'UTF-8'); // "好、這"
?>
常見問題與解決
問題 1:轉換後內容丟失/截斷
<?php
$c = '測試•字符轉換•五一快樂!'; // 含特殊符號 •
// 錯誤:丟失後續內容
echo iconv('UTF-8', 'GBK', $c); // 只輸出 "測試"
// 正確:加 //IGNORE
echo iconv('UTF-8', 'GBK//IGNORE', $c); // "測試字符轉換五一快樂!"
?>
問題 2:特定字符無法轉換 (如 — 破折號)
<?php
$str = "標題—內容"; // — (U+2014) 在 GBK 中不存在
// 方案 1:忽略
iconv('UTF-8', 'GBK//IGNORE', $str); // "標題內容"
// 方案 2:音譯替換
iconv('UTF-8', 'GBK//TRANSLIT', $str); // "標題--內容" (替換為雙連字符)
// 方案 3:預先替換
$str = str_replace('—', '--', $str);
iconv('UTF-8', 'GBK', $str);
?>
問題 3:編碼檢測與自動轉換
<?php
function smartConvert($str, $to = 'UTF-8') {
$encodings = ['UTF-8', 'GBK', 'GB2312', 'BIG5', 'ASCII'];
$from = mb_detect_encoding($str, $encodings, true);
if ($from && $from !== $to) {
return iconv($from, $to . '//IGNORE', $str);
}
return $str;
}
?>
iconv vs mb_convert_encoding 對比
| 特性 | iconv | mb_convert_encoding |
| 性能 | 快 (C層實現) | 較慢 |
| 多源編碼自動檢測 | 不支持 | 支持 (指定數組/auto) |
| //IGNORE //TRANSLIT | 支持 | 不支持 |
| 非法字符處理 | 截斷/忽略/替換 | 替換為 ? 或子字符 |
| 依賴擴展 | iconv (通常內置) | mbstring (需啟用) |
最佳實踐建議
- 優先使用 iconv + //IGNORE:性能好、防截斷
- 編碼未知時:用 `mb_convert_encoding($str, 'UTF-8', 'auto')`
- 已知源編碼:直接 `iconv('GBK', 'UTF-8//IGNORE', $str)`
- 批量處理文件:`iconv -f GBK -t UTF-8 input.txt -o output.txt` (命令行)
- PHP 5.0+ iconv 內置:無需額外安裝,Windows 需啟用 `extension=iconv`
支持的編碼列表
<?php
// 獲取所有支持編碼
print_r(iconv_get_encoding('all'));
// 或命令行
// iconv -l
?>
常用:UTF-8, GBK, GB2312, BIG5, ISO-8859-1, Windows-1252, ASCII, SJIS, EUC-JP 等。