在 Windows 開發環境 (如 Win7) 下使用 iconv() 進行編碼轉換 (例如 GB2312 轉 UTF-8) 運作正常,但部署到 Linux 伺服器時,iconv() 總是回傳 false,即使 phpinfo() 顯示 iconv 模組已正確載入。
Linux 系統預設的 iconv 實作基於 glibc,某些字元集轉換 (特別是中文編碼如 GB2312、GBK) 支援度不如 libiconv 完整,導致轉換失敗回傳 false。
PHP 的 mbstring 擴充套件內建支援多種編碼轉換,不依賴系統底層 iconv 實作,跨平台相容性佳。
<?php
// 原本失效的寫法
// $str = iconv("GB2312", "UTF-8", $str);
// 改用 mb_convert_encoding
$str = mb_convert_encoding($str, "UTF-8", "GB2312");
// 或自動偵測來源編碼
$str = mb_convert_encoding($str, "UTF-8", "auto");
?>
確保 php.ini 已啟用 extension=mbstring。
若必須使用 iconv(),需安裝 libiconv 並重新編譯 PHP:
wget ftp://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz (建議較新版本)tar zxvf libiconv-1.17.tar.gz
cd libiconv-1.17
./configure --prefix=/usr/local/libiconv
make && make install
./configure --with-iconv=/usr/local/libiconv ... (其他參數)
make && make install
注意: 此方案涉及伺服器環境重建,風險較高,非必要不建議。
<?php
$str = "測試中文";
echo "原始編碼: " . mb_detect_encoding($str) . "<br>";
$utf8 = mb_convert_encoding($str, "UTF-8", "GB2312");
echo "轉換後: $utf8<br>";
?>
跨平台專案優先使用 mbstring 函式庫 (mb_convert_encoding, mb_detect_encoding 等),避免系統層級 iconv 實作差異導致的相容性問題。