中文編碼方案中最有名的就是GB2312,它是中國(guó)國(guó)家標(biāo)準(zhǔn)總局于1980年發(fā)布,并于1981年5月1日實(shí)施的。除中國(guó)外,新加坡等地也采用此編碼。可以說GB2312是中文編碼的基石,后續(xù)基本都是對(duì)它的補(bǔ)充和升級(jí)。它共收入了6763個(gè)漢字,包括一級(jí)漢字3755個(gè)(最常用的),二級(jí)漢字3008個(gè)(比較常用的)。同時(shí)收入了拉丁字母、希臘字母、日本片假名、注音符號(hào)、西里爾字母等總計(jì)682個(gè)字符。之前介紹的泰國(guó)字符集和歐美字符集都是使用16×16的表格,GB2312也是類似的,但是因?yàn)樗淖址麛?shù)量非常多(和歐美等相比),所以它使用的是一個(gè)94×94的表格。GB2312編碼的每一個(gè)字符都在這個(gè)表格里,為了方便,這個(gè)表格的行號(hào)我們稱為區(qū)碼(從1開始),列號(hào)我們稱為位碼(從1開始)。這實(shí)際上就是每行是一個(gè)區(qū)。連續(xù)的幾個(gè)區(qū)因?yàn)楸4娴淖址年P(guān)聯(lián)性,我們又把把所有區(qū)分為了幾個(gè)區(qū)段:
- 01~09區(qū):用于存放拉丁字母、希臘字母、日本片假名、注音符號(hào)、西里爾字母等總計(jì)682個(gè)字符。注意,原則上一個(gè)有846(94×9)個(gè)位置,但只使用了682個(gè)。
- 10~15區(qū):空區(qū),預(yù)留,為后續(xù)擴(kuò)展。但實(shí)際上,10區(qū)和11區(qū)已經(jīng)使用了(這個(gè)內(nèi)容可以參考附錄部分)。
- 16~55區(qū):最常用的、一級(jí)漢字,共3755個(gè),按拼音排序(新華字典就是這種排序方式)。
- 56~87區(qū):比較常用的,二級(jí)漢字,共3008個(gè),按部首/筆畫排序(康熙字典就是這種排序方式)。
- 88~94區(qū):空區(qū),預(yù)留。目前還沒有啟用,估計(jì)后續(xù)也不會(huì)啟用了。
下圖(圖1)為編碼的局部示意圖(完整的太大了,就不展示了,有需要的可以參考附錄部分):上圖中,第17行,第6列的字——寶,編碼就應(yīng)該是:區(qū)碼為17(十六進(jìn)制為11),位碼為6(十六進(jìn)制為06),所以,“寶”這個(gè)字的編碼(十六進(jìn)制)就是11 06。但是,GB2312編碼和之前介紹的泰文編碼和歐美字符集不一樣,它在序列化時(shí)是需要轉(zhuǎn)碼的。PS: 序列化的含義是,存儲(chǔ)化,就是轉(zhuǎn)換為一個(gè)連續(xù)的內(nèi)存的過程,文字保存(到磁盤等)和網(wǎng)絡(luò)傳輸,使用的都是序列化后的數(shù)據(jù)。最簡(jiǎn)單的一個(gè)轉(zhuǎn)碼方案稱為國(guó)標(biāo)碼,也叫交換碼。轉(zhuǎn)換方法是區(qū)碼和位碼分別加上32,也就是十六進(jìn)制的20,這樣,“寶”這個(gè)字的交換碼(十六進(jìn)制)就是13 08。當(dāng)然,現(xiàn)在最常用的是機(jī)內(nèi)碼,也叫內(nèi)碼。轉(zhuǎn)換方法是區(qū)碼和位碼分別加上160(相對(duì)于GB2312),也就是十六進(jìn)制的A0,這樣,“寶”這個(gè)字的內(nèi)碼(十六進(jìn)制)就是B1 A6。在現(xiàn)代計(jì)算機(jī)中,基本使用的都是內(nèi)碼。如果,把一個(gè)文件編碼為GB2312后,如果內(nèi)容只有一個(gè)字——寶,那么,你用二進(jìn)制工具打開后,看到的通常都是 B1 A6。內(nèi)碼的本質(zhì),要說這個(gè)問題,要先說交換碼的目的。本文后續(xù)部分,說的都是十六進(jìn)制的數(shù)。交換碼是為了避開ASCII字符中的不可顯示字符(00到1F)和空格(20)。這樣,區(qū)碼和位碼都加20,(區(qū)碼和位碼)就避開了它們。這樣,區(qū)碼和位碼的有效區(qū)間就都是[21, 7E]。注意,有趣的點(diǎn)來了,這個(gè)使用7位就可以保存了,而計(jì)算機(jī)的一字節(jié)有8位,那么,把交換碼的第8位設(shè)置為1,就能和ASCII完美避開了。原來第8位為0,變成1的本質(zhì)就是加上80。這樣,加上20,然后再加上80,這不就是加上A0。目前,看到的GB2312編碼實(shí)際上都是GB2312編碼的內(nèi)碼。總結(jié)一下:原始的GB2312編碼中,區(qū)碼和位碼的有效區(qū)間就都是[01, 5E]。GB2312交換碼中,區(qū)碼和位碼的有效區(qū)間就都是[21, 7E]。原始的GB2312內(nèi)碼中,區(qū)碼和位碼的有效區(qū)間就都是[A1, FE]。在實(shí)際的使用中,GB2312通常是使用內(nèi)碼,例如:“寶” 這個(gè)字的GB2312編碼(十六進(jìn)制)就是 B1 A6,而不會(huì)稱GB2312內(nèi)碼,或者真的轉(zhuǎn)為GB2312編碼的 11 06。真正的GB2312(內(nèi)碼)也已經(jīng)很難看到了,更常見的是GBK(哪怕是GB2312,也可能標(biāo)識(shí)為GBK)。下次,我們就一起看一下GBK編碼。
閱讀原文:原文鏈接
該文章在 2025/4/18 11:49:56 編輯過