在 PHP 開發中,字符編碼轉換是常見需求。iconv 函數是處理此類任務的核心工具,但其安裝配置(特別在 Windows 環境)與某些已知 Bug 常讓開發者踩坑。本文將詳細說明 Windows 下啟用 iconv 擴展的完整步驟、解決「—」字符轉 GB2312 丟失數據的經典 Bug,並提供常用函數示例。
不同於 Linux 需重新編譯 PHP,Windows 下只需調整 php.ini 並部署 GNU iconv 庫即可:
libiconv-1.9.1.bin.woe32.zip(或更新版本)。bin 目錄下的 charset.dll、iconv.dll、iconv.exe 複製到系統路徑(如 C:/Windows/)。此步驟至關重要,因 PHP 的 php_iconv.dll 依賴這些庫文件。extension_dir 指向正確的擴展目錄(建議使用絕對路徑並以斜槓結尾)。extension=php_iconv.dll。phpinfo() 驗證 iconv 模組已載入。將 UTF-8 轉 GB2312 時,若字符串包含「—」(全形破折號),iconv 會報錯並導致該字符及其後內容全部丟失。
解決方案:在目標編碼後追加 //IGNORE 標誌,指示函數忽略無法轉換的字符:
<?php
$data = "測試—內容";
$result = iconv("UTF-8", "GB2312//IGNORE", $data);
// 結果將保留「測試」與「內容」,自動跳過無法轉換的「—」
?>
原理://IGNORE 告訴 iconv 遇到非法字符時跳過而非中止,避免後續數據丟失。
| 函數 | 說明 |
|---|---|
iconv() | 字符串編碼轉換(PHP 5+ 內置) |
iconv_substr() | 按字符數(而非字節)截取字符串 |
iconv_strlen() | 獲取指定編碼下的字符串長度 |
iconv_get_encoding() | 獲取當前腳本的編碼設置 |
<?php
$str = '你好,這裡是賣咖啡!';
echo $str . '<br />';
// GB2312 轉 UTF-8
echo iconv('GB2312', 'UTF-8', $str) . '<br />';
// 截取第 2 個字符(按字符數)
echo iconv_substr($str, 1, 1, 'UTF-8') . '<br />';
// 獲取當前編碼信息
print_r(iconv_get_encoding());
// 獲取字符串長度(按字符)
echo iconv_strlen($str, 'UTF-8') . '<br />';
// 另一種常見用法:TRANSLIT 嘗試近似轉換
$content = iconv("UTF-8", "gbk//TRANSLIT", $content);
?>
掌握 iconv 的正確安裝姿勢與 //IGNORE 技巧,能有效解決 90% 的編碼轉換難題。實際項目中建議統一使用 UTF-8,僅在與舊系統交互時才進行轉碼。