首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 中文編碼轉換:從 GBK 到 Big5 的實作指南

     編輯:PHP 相關知識

前言

在 PHP 早期開發中,中文編碼轉換一直是讓開發者頭疼的問題。特別是 GBK 與 Big5 之間的轉換,由於編碼機制不同,直接對應並不總是可行。本文將介紹一個實用的 PHP 類別 qswhBig5,協助你處理 GBK 至 Big5 的轉換。

核心概念釐清

  • GBK 的繁體字 ≠ Big5:GBK 內建的繁體字碼位與 Big5 標準不同,但大多數常用繁體字在 Big5 中都有對應編碼。
  • 不可逆轉換:並非每個 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);
    }
}
?>

使用建議

  1. 下載對照表:qswhBig5.zip
  2. 確保 PHP 環境允許檔案讀寫權限。
  3. 大量轉換前請先備份資料,測試少量樣本確認效果。

結語

雖然現代 PHP 專案多採用 UTF-8 統一編碼,避免此類轉換麻煩,但在維護舊系統或處理特定編碼資料時,此類別仍具參考價值。理解編碼轉換原理,有助於排查亂碼問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved