標準的 iconv 擴展雖然功能完整,但在某些受限環境(如共享主機)中無法使用。本文提供一套基於對照表的輕量級編碼轉換方案,對照表僅 51KB(遠小於完整映射表的 184KB),且無需經過 Unicode 中間轉換,效能優異。
<?php
// 載入對照表 gb2utf8.txt 到陣列
$filename = "gb2utf8.txt";
$fp = fopen($filename, "r");
while (!feof($fp)) {
list($gb, $utf8) = fgetcsv($fp, 10);
$charset[$gb] = $utf8;
}
fclose($fp);
/**
* GB2312 轉 UTF-8
*/
function gb2utf8($text, &$charset) {
// 將漢字與非漢字分離
preg_match_all("/(?:[\x80-\xff].)|[\x01-\x7f]+/", $text, $tmp);
$tmp = $tmp[0];
// 找出需轉換的漢字
$ar = array_intersect($tmp, array_keys($charset));
// 替換編碼
foreach ($ar as $k => $v) {
$tmp[$k] = $charset[$v];
}
return join('', $tmp);
}
/**
* UTF-8 轉 GB2312
*/
function utf82gb($text, &$charset) {
$p = "/[\xf0-\xf7][\x80-\xbf]{3}|[\xe0-\xef][\x80-\xbf]{2}|[\xc2-\xdf][\x80-\xbf]|[\x01-\x7f]+/";
preg_match_all($p, $text, $r);
$utf8 = array_flip($charset);
foreach ($r[0] as $k => $v) {
if (isset($utf8[$v])) {
$r[0][$k] = $utf8[$v];
}
}
return join('', $r[0]);
}
// 測試範例
$s = gb2utf8('這是對照表的測試', $charset);
echo utf82gb($s, $charset);
?>
gb2utf8.txt 對照表檔案(CSV 格式:GB2312碼,UTF-8碼)gb2utf8() 或 utf82gb() 進行雙向轉換注意:此方案適用於無法安裝 iconv 或 mbstring 擴展的環境,現代專案建議優先使用內建函式。