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

不依賴 iconv 擴展的 GB2312 與 UTF-8 互轉 PHP 實作

     編輯:PHP 綜合知識

背景與優勢

標準的 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);
?>

使用說明

  1. 準備 gb2utf8.txt 對照表檔案(CSV 格式:GB2312碼,UTF-8碼)
  2. 將上述程式碼引入專案
  3. 呼叫 gb2utf8() 或 utf82gb() 進行雙向轉換

注意:此方案適用於無法安裝 iconv 或 mbstring 擴展的環境,現代專案建議優先使用內建函式。

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