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