字符編碼發展史3 — GB2312/Big5/GBK/GB18030
上一篇《字符編碼發展史2 — ISO-8859-N》我們講解了ANSI編碼中的ISO-8859-N。本篇我們將繼續講解字符編碼的第二個發展階段中的GB2312/Big5/GBK/GB18030。
2.2. 第二個階段 本地化
2.2.3. 多字節編碼
ISO 8859-N系列的編碼都是單字節編碼,可收錄最多255個字符,這對歐洲地區的拉丁語系的語言來說,已經能夠滿足他們的編碼需求了。但是對于亞洲地區以漢字為基礎的語系,如:中國的漢語,以及日語、韓語、越南語,256個字符顯然是不夠的,單字節編碼就無法完全表示了。于是就出現了很多由多個字節組成的多字節編碼,如:GB2312、Big5、GBK、GB18030。
2.2.3.1. GB2312
1. 什么是GB2312?
GB2312是中國國家標準總局發布的一種用于中文信息交換的字符編碼標準,全稱為《信息交換用漢字編碼字符集·基本集》。它于1981年5月1日實施,標準號為GB2312-1980,所以你看到的GB2312-1980、GB2312-80、GB2312指的都是同一個東西,只不過有多個不同的叫法。
GB2312中的“GB”為“國標”的漢語拼音首字母縮寫,即“國家標準”之意,GB2312是早期在計算機中處理簡體中文的重要標準,后被GBK和GB18030替代。
GB2312主要收錄了簡體中文字符,共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個。覆蓋了中國大陸99.75%的使用頻率。
為了與ASCII兼容,小于128的字符含義與ASCII相同,但兩個大于128(0xA1-0xFE)的字符連在一起時,就表示一個漢字。
在這些編碼里,還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在ASCII里本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的全角字符,而原來在127以下的那些就叫半角字符了。
2. GB2312的編碼規則
GB2312只是編碼表,用區碼位來表示,分為94個區(01-94),每區94個字符(01-94),你可以理解為一個“94 * 94的二維矩陣”,矩陣里每一個單元代表一個字符。
GB2312在計算機中通常都是用"EUC-CN"表示法,在計算機編碼時,區和位分別占用一個字節,前面一個字節(0xA1-0xFE)表示區位,稱之為高字節;后面一個字節(0xA1-0xFE)表示碼位,稱之為低字節。為了與ASCII兼容(范圍為0x00~0x7F),每個區和位對應的字節加上0xA0來表示,舉例:“萬”字在45區82位,45 + 0xA0 = 0x2D + 0xA0 = 0xCD,82 + 0xA0 = 0x52 + 0xA0 = 0xF2,所以“萬”這個字在計算機編碼后表示為0xCDF2。(注意十進制與十六進制的轉換)
因此,GB2312在計算機里編碼的范圍就是:0xA1A1~0xFEFE。這里為什么是加上0xA0而不是0x80(這樣的話就可以多出7168個編碼空間),目前不得而知。
GB2312各個區段收集的字符類型如下:
- 01-09區: 為特殊符號。
- 10-15區: 沒有編碼,屬于保留區段。
- 16-55區: 為一級漢字,按拼音排序,共3755個。
- 56-87區: 為二級漢字,按部首/筆畫排序,共3008個。
- 88-94區: 沒有編碼,屬于保留區段。
3. GB2312的編碼表

GB2312編碼的開始部分
完整的編碼表參見:GB2312 編碼表
2.2.3.2. Big5
1. 什么是Big5?
Big5又稱為大五碼或五大碼,是使用繁體中文(正體中文)社區中最常用的電腦漢字字符集標準,共收錄13060個漢字,臺灣地區繁體中文標準字符集,采用雙字節編碼,共收錄 13053 個中文字,于 1984 年實施。
中國人都知道,由于歷史原因,中國大陸和臺灣雖然同屬一個中國,但目前還是兩個政府在執政(特別說明:這句話寫于2024年9月)。中國大陸地區在1956年正式公布了《漢字簡化方案》,此后通用漢字就采用了簡體中文,而臺灣地區依然保留使用傳統的繁體中文。所以臺灣地區要應用計算機就必須要解決繁體字的編碼問題,而當時也沒有繁體字的通用編碼(GB2312只收錄了簡體中文漢字),所以他們就自己制定了一套繁體字的編碼Big5,且與GB2312不兼容。
大五碼(Big5)是由臺灣財團法人信息產業策進會為五大中文套裝軟件所設計的中文共通內碼,在1983年12月完成公告,于1984年實施。
2. Big5的編碼規則
Big5是一套雙字節字符集,以兩個字節來安放一個字。第一個字節稱為高位字節,使用了0x81-0xFE;第二個字節稱為低位字節,使用了0x40-0x7E和0xA1-0xFE。
在Big5的的編碼區分類:
0x8140-0xA0FE: 保留給用戶自定義字符(造字區)。0xA140-0xA3BF: 標點符號、希臘字母及特殊符號,包括在0xA259-0xA261,安放了九個計量用漢字:兙兛兞兝兡兣嗧瓩糎。0xA3C0-0xA3FE: 保留。此區沒有開放作造字區用。0xA440-0xC67E: 常用漢字,先按筆劃再按部首排序。0xC6A1-0xC8FE: 保留給用戶自定義字符(造字區)。0xC940-0xF9D5: 次常用漢字,亦是先按筆劃再按部首排序。0xF9D6-0xFEFE: 保留給用戶自定義字符(造字區)。
3. Big5的編碼表

Big5編碼的開始部分
完整的編碼表參見:Big5 編碼表
2.2.3.3. GB13000
特別說明:GB13000是歷史發展過程中的中間產物,沒有正式發布實施,也沒有被業界采用。
(GB13000收錄的字符,后面被編入到GBK中,之后又被GB18030繼承。所以你大可不必關心這個編碼,可以把它當做從來沒有出現過。)
2.2.3.4. GBK
1. 什么是GBK?
GBK的全稱《漢字內碼擴展規范》,Chinese Internal Code Specification,K為漢語拼音 Kuo Zhan中Kuo字的聲母。是對GB2312的拓展。
GBK最初是由微軟對GB2312的擴展,也就是CP936(Code Page 936)的擴展(原來的CP936是對應GB 2312),最初出現于"Windows 95簡體中文版"中。GBK本身并非國家標準,但由于Windows產品的流行和在大陸廣泛被使用,后來中華人民共和國國家有關部門將其作為技術規范的指導性文件。
GB2312的擴展,在現在的windows系統中仍然使用代碼頁CP936表示,但是同樣的的代碼頁跟一開始的的代碼頁只支持GB2312編碼不同,現在的代碼頁支持同時也向下兼容GB2312。
相較于GB2312,GBK主要新增了中文繁體字和CJK字符。CJK是Chinese(中文), Japanese(日語), Korean(韓語)的首字符縮寫,即以漢字為基礎的語系中的中文、日語、韓語的字符集合。后面又擴展包含了越南語(Vietnam)的字符,即CJKV,中、日、韓、越字符集。
2. GBK的編碼規則
GBK對GB2312未編碼的空間(GB2312未充分利用兩個字節的所有空間)再進行編碼。共占23940個碼位(碼位區間0x8140~0xFE7E和0x8180~0xFEFE),定義了21886個字符。包含了Big5編碼中的所有漢字,但是與Big5編碼不兼容。
與GB2312一樣,GBK干是雙字節編碼。不同的是GBK只要求第一個字節(即高字節)大于127就固定表示這是一個漢字的開始,GBK的低字節可以小于127,即低字節的首位可以是0,也可以是1;而GB2312要求兩個字節都必須大于127。

GBK和GB18030編碼區間
GBK編碼區的分類:
- 漢字區
- GBK/2:
0xB0A1~pxF7FE, 收錄GB2312漢字6763個,按原序排列; 第一個字節為什么是0xB0~0xF7,我們從前面GB2312的編碼規則知道,GB2312實際收錄的一級、二級漢字是16-87區,0xA1 + 15 = 0xA1 + 0x0F = 0XB0,0xA1 + 86 = 0xA1 + 0x56 = 0XF7。 - GBK/3:
0x8140~pxA0FE, 收錄GB 13000.1中的 CJK 漢字6080個。 - GBK/4:
0xAA40~pxFEA0, 收錄 CJK 漢字和增補的漢字 8160 個。
- GBK/2:
- 圖形符號區
- GBK/1:
0xA1A1~0xA9FE, 收錄GB2312已有的特殊符號,除GB2312的符號外,還增補了一些其它符號。 - GBK/5:
0xA840~0xA9A0,GB 13000.1擴充非漢字區。包括BIG-5 非漢字符號、結構符等,共計符號166個。
- GBK/1:
- 用戶自定義區
- EUDC1:
0xAAA1-0xAFFE,碼位 564 個。 - EUDC2:
0xF8A1-0xFEFE,碼位 658 個。 - EUDC3:
0xA140-0xA7A0,碼位 672 個。注: 區盡管對用戶開放,但限制使用,因為不排除未來在此區域增補新字符的可能性。
- EUDC1:
3. GBK的編碼表

GBK編碼的開始部分
完整的編碼表參見:GBK 編碼表
2.2.3.5. GB18030
1. 什么是GB18030?
GB 18030全稱:“國家標準GB 18030-2005《信息技術中文編碼字符集》”,是中華人民共和國現時最新的內碼字集。GB 18030與GB 2312完全兼容,也與GBK兼容,支持GB 13000及Unicode的全部統一漢字,共收錄漢字70244個。支持中國國內少數民族的文字,不需要動用造字區;漢字收錄范圍包含繁體漢字以及日韓漢字。
相較于GBK,GB 18030主要新增了中國少數民族的語言字符,如:藏文、規范彝文、朝鮮文、維哈柯文、蒙古文、滇東北苗文、傈僳文、西雙版納新傣文、西雙版納老傣文、德宏傣文。
GB18030有三個版本:GB18030-2000、GB18030-2005和GB18030-2022。截止2024年9月,最新版本是GB18030-2022,相較于GB18030-2005新增了17000余個字符,其中包括196個中國國務院在2013年公布的《通用規范漢字》(2005版本不包含的部分)。
在本文中,沒有指明版本的GB18030一般是指GB18030-2005。
2. GB18030的編碼規則
GB 18030采用多字節編碼,每個字符可以由1個、2個或4個字節組成。
- 單字節: 其值從
0x00到0x7F,與 ASCII 編碼兼容。 - 雙字節: 碼位區間
0x8140~0xFE7E和0x8180~0xFEFE,也就是GBK的全部碼位空間。占23940個碼位,定義了21886個字符。 - 四字節: 碼位區間
0x81308130~0xFE39FE39,占1587600個碼位。
(0x81308130~0xFE39FE39表示第一個字節的值從0x81到0xFE,第二個字節的值從0x30到0x39,第三個字節從0x81到0xFE,第四個字節從0x30到0x39。也就是上一小節“GBK和GB18030編碼區間”圖的粉紅區域)
3. 官方對GB18030的介紹
我們看一下國家市場監督總局發布的一篇GB 18030介紹的文章《一圖讀懂“GB 18030-2022
信息技術 中文編碼字符集”》
2.2.3.6. 總結
| 字符編碼 | 兼容ASCII | 字節類型 | 收集的主要字符類型 | 備注 |
|---|---|---|---|---|
| GB2312 | 兼容 | 單雙字節 | 簡體中文 | 兩個字節首位都是0 |
| Big5 | 兼容 | 單雙字節 | 繁體中文 | 只保證第一個字節首位是0 |
| GBK | 兼容 | 單雙字節 | GB2312基礎上增加繁體中文、日文、韓文 | 只保證第一個字節首位是0 |
| GB18030 | 兼容 | 多字節 1、2、4個字節 |
GBK基礎上增加中國的少數名族語言字符 | 只保證第一個字節首位是0 |
- 單雙字節:小于128的ASCII字符時是單字節,其他字符(如漢字)是雙字節。
- 多字節:小于128的ASCII字符時是單字節,其他字符(如漢字)是雙字節或四字節。

未完待續…… 欲知后事如何,且看下回分解。
下回預告:字符編碼發展史4 — Unicode與UTF-8。
歷史文章推薦:
大家好,我是陌塵。
IT從業10年+, 北漂過也深漂過,目前暫定居于杭州,未來不知還會飄向何方。
搞了8年C++,也干過2年前端;用Python寫過書,也玩過一點PHP,未來還會折騰更多東西,不死不休。
感謝大家的關注,期待與你一起成長。

浙公網安備 33010602011771號