萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 產出 GB2312 編碼全部漢字的範例程式碼

GB2312 編碼範圍涵蓋 6,763 個漢字,分為兩級:一級常用字 (3,755 個)、二級次常用字 (3,008 個)。本文提供一段精簡 PHP 程式碼,遍歷所有區位碼並寫入檔案,可用於字庫生成、編碼測試、字型子集化等場景。

核心程式碼

<?php
$fp = fopen('gb2312_all.txt', 'w');
// 區碼範圍:0xB0-0xF7 (16-87 區)
for ($area = 0xB0; $area <= 0xF7; $area++) {
    // 位碼範圍:0xA1-0xFE (1-94 位)
    for ($pos = 0xA1; $pos <= 0xFE; $pos++) {
        // pack('CC') 將兩個位元組寫入二進位檔案
        fwrite($fp, pack('CC', $area, $pos));
    }
}
fclose($fp);
?>

關鍵點解析

  • 區位碼結構:GB2312 以「區」(0xA1-0xFE)、「位」(0xA1-0xFE) 兩字節編碼;實際使用區碼 0xB0-0xF7 (第 16-87 區),位碼全範圍 0xA1-0xFE。
  • pack('CC', $area, $pos):將兩個整數轉為對應的二進位字元寫入檔案,產生純 GB2312 編碼的二進位串流。
  • 輸出檔案大小:(0xF7-0xB0+1) × (0xFE-0xA1+1) × 2 bytes = 68 × 94 × 2 = 12,784 bytes (含少數未定義碼位)。

進階應用:轉為 UTF-8 陣列備查

$chars = [];
for ($area = 0xB0; $area <= 0xF7; $area++) {
    for ($pos = 0xA1; $pos <= 0xFE; $pos++) {
        $gb = pack('CC', $area, $pos);
        $utf8 = iconv('GB2312', 'UTF-8//IGNORE', $gb);
        if (strlen($utf8) === 3) { // 過濾未定義碼位
            $chars[] = $utf8;
        }
    }
}
file_put_contents('gb2312_utf8.json', json_encode($chars, JSON_UNESCAPED_UNICODE));

注意事項

  • PHP 腳本檔案本身需以 UTF-8 無 BOM 儲存,避免編碼混亂。
  • iconv 轉換時加 //IGNORE 忽略無法轉換的碼位 (如 0xD7FA 等 GB2312 未定義區)。
  • GB2312 已被 GBK/GB18030 取代,現代專案建議直接使用 UTF-8;此碼僅供舊系統相容、字庫研究使用。
copyright © 萬盛學電腦網 all rights reserved