在 PHP 早期開發中,中文編碼轉換一直是讓開發者頭疼的問題。特別是 GBK 與 Big5 之間的轉換,由於編碼機制不同,直接對應並不總是可行。本文將介紹一個實用的 PHP 類別 qswhBig5,協助你處理 GBK 至 Big5 的轉換。
qswhBig5 類別內建三個主要方法:
qswhStr($gb, $fail = "??"):將 GBK 字串轉換為 Big5 字串,$fail 參數指定無法轉換時的替代字符(預設為 "??")。qswhFile($filename, $fail = "??"):直接轉換整個檔案內容,並自動備份原檔(副檔名為 .qswh)。qswhDir($dir):批次轉換目錄下所有檔案(排除 .qswh 備份檔)。類別建構子會載入對照表檔案 qswhBig5.php(需自行下載)。轉換核心邏輯逐字節檢查:若字節值大於 127(雙位元組字符),則查閱對照表尋找對應的 Big5 碼位;找不到時依 $fail 參數決定輸出。
<?php
class qswhBig5 {
var $qswhData;
function qswhBig5($filename="qswhBig5.php") {
$this->qswhData = file($filename);
}
function qswhStr($gb, $fail="??") {
$ret = "";
for ($i=0; $i<strlen($gb); $i++) {
if (($p = ord(substr($gb,$i,1))) > 127) {
$q = ord(substr($gb,++$i,1));
$tmp = $this->qswhData[$p-128];
for ($j=0; $j<strlen($tmp); $j+=6)
if (($k = hexdec(substr($tmp,$j,2))) >= $q) break;
if ($k == $q)
$q = chr(hexdec(substr($tmp,$j+2,2))).chr(hexdec(substr($tmp,$j+4,2)));
else if ($fail == "") $q = chr($p).chr($q); else $q = $fail;
} else $q = chr($p);
$ret .= $q;
}
return $ret;
}
function qswhFile($filename, $fail="??") {
if (!file_exists($filename.".qswh")) copy($filename, $filename.".qswh");
$fp = fopen($filename, "r+");
$tmp = fread($fp, filesize($filename));
rewind($fp);
fwrite($fp, $this->qswhStr($tmp, $fail));
fclose($fp);
}
}
?>
雖然現代 PHP 專案多採用 UTF-8 統一編碼,避免此類轉換麻煩,但在維護舊系統或處理特定編碼資料時,此類別仍具參考價值。理解編碼轉換原理,有助於排查亂碼問題。