Loading AI tools
来自维基百科,自由的百科全书
GB/T 2312[註 1],GB/T 2312—80 或 GB/T 2312—1980 是中華人民共和國國家標準簡體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》,通常簡稱GB(「國標」漢語拼音首字母),又稱GB0,由中國國家標準總局於1980年發布,1981年5月1日實施。GB/T 2312編碼通行於中國大陸;新加坡等地也採用此編碼。中國大陸幾乎所有的中文系統和國際化的軟件都支持GB/T 2312。
GB/T 2312標準共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個;同時收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、注音符號、俄語西里爾字母在內的682個字符。
GB/T 2312的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率。但對於人名、古漢語等方面出現的罕用字和繁體字,GB/T 2312不能處理,而是由一系列的國標輔助集負責編碼和顯示(如GB/T 12345《信息交換用漢字編碼字符集 第一輔助集》、GB/T 7589 《信息交換用漢字編碼字符集 第二輔助集》及GB/T 7590《信息交換用漢字編碼字符集 第四輔助集》),但是 ISO-2022-CN-EXT 最終未給國標除了 GB/T 2312 以外的其他輔助集提供逃逸字符串[1][2]。後來GBK及GB 18030漢字字符集相繼出現以解決這些問題。
GB/T 2312 中對所收漢字進行了「分區」處理,每區含有94個漢字/符號,共計94個區。實際上,GB/T 2312 只使用了87區。
用所在的區和位來表示字符(實際上就是碼位)的方法稱為區位碼(或許叫「區位號」更為恰當[來源請求])。例如「万」字在45區82位,所以「万」字的區位碼是 45-82(45是「區碼」,82是「位碼」)。在儲存進電腦時,電腦會在區位碼上加上特定數字後才保存進內存以確保和其他編碼兼容(如 ASCII)。轉碼後,區位碼的「區碼」會變成「高位字節」,而「位碼」會變成「低位字節」。
下列是 GB/T 2312 分區後在區段內儲存的字符:
在 GB 2312 內,每個漢字及符號的碼位使用兩個字節來表示。第一個字節稱為「高位字節」,對應分區的編號(把區位碼的「區碼」加上特定值);第二個字節稱為「低位字節」,對應區段內的個別碼位(把區位碼的「位碼」加上特定值)。
為了避開ASCII字符中的不可顯示字符(十六進制為0×00
至0×1F
,十進制為0至31)及空格字符(十六進制為0×20
,十進制為32),國標碼(又稱為交換碼)參考 ISO 2022 規定表示非 ASCII 字符雙字節編碼範圍為十六進制為 <21 21>
-<7E 7E>
,十進制為 (33, 33) 至 (126, 126)。因此,在進行碼位轉換時,須將「區碼」和「位碼」分別加上32(十六進制為0×20
)作為國標碼。
在這個編碼模式內,軟件需要使用低端控制字符(C0),高端控制字符(C1)和US-ASCII字符集(GL)標註字符屬於單字節(ASCII)還是雙字節,相對容易造成亂碼(如丟失控制/轉義字符)。
在 GB/T 2312 內,高位字節使用了0x21—0x77
(把01—87區的區號加32或0×20
),低位字節使用了0x21—0x7E
(把01—94加上32或0×20
)。
例:「万」字(區位碼 45-82)的 ISO 2022 碼十進制為:(45+32, 82+32) = (77, 114),十六進制為:<4D 72>
。[3][4]
因為國標碼和通用的ASCII碼衝突,因此後續為了方便辨認單字節和雙字節的編碼,部分廠商在 ISO 2022 的基礎上把雙字節字符的二進制最高位都從 0 換成 1,即相當於把 ISO 2022 的每個字節都再加上128(十六進制為0×80
)得到「機內碼」表示,簡稱「內碼」。把「區碼」和「位碼」分別加上160(十六進制為0×A0
)也可以得到相同的機內碼表示,這種格式也就是EUC。使用GB/T 2312的程序通常採用 EUC 儲存方法,以便兼容於 ASCII。這種格式稱為EUC-CN。瀏覽器編碼表上的「GB2312」就是指這種表示法。
在 GB/T 2312 內,高位字節使用了0xA1—0xF7
(把01—87區的區號加160或0×A0
),低位字節使用了0xA1—0xFE
(把01—94加上160或0×A0
)。非 ASCII 字符雙字節編碼範圍為十六進制為 <A1 A1>
-<FE FE>
,十進制為 (161, 161) 至 (254, 254)。
例:「万」字(區位碼 45-82)的 EUC 碼十進制為:(45+160, 82+160) = (205, 242),十六進制為:<CD F2>
。[3][4]
HZ 編碼是由李楓峰在1988年發明的編碼系統[5]。其目的是在7字節的限制下(如電子郵件)儲存 GB/T 2312 的雙字節字符。其在 ISO 2022 編碼字符的前後分別加上轉義字符~{
(7E 7B
)和~}
(7E 7D
)後,使用正常的ASCII轉碼變成 ASCII 字符。部分機器也可以接受使用 EUC-CN 編碼的轉義字符。
例:「万」字(區位碼 45-82)的 ISO 2022 碼十六進制為 <4D 72>
。加上轉義字符後,字符串變成7E 7B 4D 72 7E 7D
。HZ的編碼即為~{Mr~}
(M
的ASCII碼是0×4D
,r
的ASCII碼是0×72
)。[6]
GB 5007.1—85《信息交換用漢字 24x24 點陣字模集》首次附錄對 GB/T 2312 之更正,包括:
GB 5007.1—85曾將「麴」(84—80)更換成「麹」,但是後續修訂(GB 5007.1—2001 和 GB/T 5007.1—2010)和其他字模集仍舊保留 GB/T 2312 的繁體偏旁「麥」之「麴」。
GB/T 2312 本身一直未有修訂,但此等修訂部份收入相關字模集(下詳)、GB/T 12345、後續之 GBK 及 GB 18030。
GB/T 2312 亦用於 ISO-IR-165。
有兩種不同的GB/T 2312實現,在它們之間存在少量的差別,其中至少有一個是錯誤的。
GBK子集與GBK/GB 18030兼容,GB2312.TXT則不兼容。後者基於ftp.unicode.org曾經提供的GB2312.TXT實現,[8]於2011年由官方棄用,[9]2016年9月時已無原文件蹤跡。此外還有很多種廠商實現。[8]
截至2015年[update],微軟.NET使用的是「GBK子集」實現。ICU[10]、libiconv-1.14、[11]php-5.6、ActivePerl-5.20、Java 1.7、Python 3.4[12]都使用「GB2312.TXT」實現。Ruby 2.2兼容兩者編碼,但內部使用「GBK子集」實現。W3C的編碼技術指南規定,應將gb2312
字節流視為GBK編碼,與GB18030一併使用同一解碼器解碼。[13]