前面的一些篇章更多談?wù)摿薝nicode的相關(guān)話題,,雖然也有提到GBK等編碼,,但都沒細(xì)說,這里打算系統(tǒng)說一下,。GB系列包括GB2312,,GBK,GB18030.
最早的是GB2312,,我們從它開始說起,。 GB2312以下為一簡(jiǎn)介(官方文檔見:http://gbread.sac.gov.cn/bzzyReadWebApp/standardresources.action?m=readFile&bzNum=GB%202312-1980&flag=1,用IE打開,,它要安裝一個(gè)ActiveX我插呀件~):
作為一個(gè)編碼字符集而言,,前面也曾說到,,它采用了所謂的二維區(qū)位編號(hào),下面是一個(gè)概覽圖: 它是一個(gè)94*94的表格,,理論上有94*94=8836個(gè)空間,。 橫的叫區(qū),豎的叫位,,總共94個(gè)區(qū),,區(qū)和位的編號(hào)都從1開始,。可以看到粗略有三大部分,。 94個(gè)區(qū)1. 中間黑色的主體部分即是漢字區(qū)了,,具體為16-87區(qū),共87-16+1=72個(gè)區(qū),,理論空間為72*94=6768.
2. 最下面的88-94區(qū)是有待進(jìn)一步標(biāo)準(zhǔn)化的空白區(qū),。 3. 關(guān)于前面的01-15區(qū),下圖為概覽圖左上角的局部放大圖: 1. 01-09區(qū)為符號(hào),、字母,、日文假名等,部分區(qū)還有空白位,。
2. 10-15區(qū)也是有待進(jìn)一步標(biāo)準(zhǔn)化的空白區(qū),。 各區(qū)的一個(gè)具體情況:
區(qū)位碼在上圖中還標(biāo)出了一個(gè)漢字“啊”,它就是GB2312方案中的天字第一號(hào)漢字,,它處于16區(qū)01位上,,所以它的區(qū)位碼即是1601.
國(guó)標(biāo)碼將區(qū)位碼的區(qū)和位分別加上32(=0x20)就得到了國(guó)標(biāo)碼。
GB2312方案規(guī)定,,對(duì)上述表中任意一個(gè)圖形字符都采用兩個(gè)字節(jié)表示,每個(gè)字節(jié)均采用七位編碼表示,。
但為何不直接采用區(qū)位碼呢,?為什么要加32呢?你也許還記得前面說到ASCII時(shí),,前面32個(gè)字符是控制碼,,中文系統(tǒng)自然也不能少了這些控制碼,為了不與這些控制碼沖突,,加上32就能跳過它們了,。
國(guó)標(biāo)碼的定位實(shí)際應(yīng)該是與ASCII一致的,,是作為國(guó)家信息交換的標(biāo)準(zhǔn)碼,。從設(shè)計(jì)上看,它并沒打算兼容ASCII,,它已經(jīng)把ASCII中的字符收錄了過來,,不過是作為所謂的全角字符來看待,但全角英文顯示效果其實(shí)是很差的,,下面是全角英文的一個(gè)示例:
顯得非常不緊湊,最終,,一種能兼容ASCII的存儲(chǔ)方案得到了廣泛采納,,這就是所謂的機(jī)內(nèi)碼了。 機(jī)內(nèi)碼將國(guó)標(biāo)碼高低字節(jié)分別加上0x80(=128)就得到了機(jī)內(nèi)碼(有時(shí)又叫交換碼),。128的二進(jìn)制形式為10000000,,加128,簡(jiǎn)單地講,,就是把國(guó)標(biāo)碼最高位置成1.至于為什么要這樣呢,?我想你應(yīng)該也清楚了,,就是要兼容ASCII,ASCII最高位為0,,國(guó)標(biāo)碼加128后,,高低字節(jié)的最高位都成了1,這樣就與ASCII區(qū)分開來,。
如果從區(qū)位碼算起,那么則是加上0x20+0x80=32+128=160=0xA0,,也即區(qū)位碼的區(qū)和位分別直接加上0xA0即可得到機(jī)內(nèi)碼,,如下圖所示: 如果你新建一個(gè)文本文件,錄入“啊”字,,以GB2312編碼方式保存(使用GBK即可,,它兼容GB2312),再用十六進(jìn)制查看,,你會(huì)發(fā)現(xiàn)使用的是機(jī)內(nèi)碼: 使用代碼的測(cè)試也可驗(yàn)證這一點(diǎn): 雖然我們常把GB2312稱為國(guó)標(biāo)碼,,但我們應(yīng)該清楚,,實(shí)際存儲(chǔ)使用的是機(jī)內(nèi)碼,,通常說到GB2312編碼時(shí)指的就是這個(gè)機(jī)內(nèi)碼了。它能兼容ASCII,,是一種變長(zhǎng)的編碼方案,,對(duì)ASCII中的字符(也即所謂的“半角西文字符”)采用一字節(jié)編碼,最高位為0,;對(duì)區(qū)位表中的字符采用兩字節(jié)編碼,,且每字節(jié)最高位均為1,以此區(qū)分,。
下面是一個(gè)混合了漢字,,半角字母a和全角字母a的編碼示例,共5個(gè)字節(jié):
你可能會(huì)想,,那國(guó)標(biāo)碼還有什么用,?
下面是三種碼在256*256坐標(biāo)中的位置的一個(gè)示意圖: GBKGBK是對(duì)GB2312的一個(gè)擴(kuò)展,,兼容GB2312,,因此也兼容ASCII,也是一個(gè)變長(zhǎng)編碼方案,。下面是一個(gè)簡(jiǎn)介:
GBK是國(guó)家有關(guān)部門與一些信息行業(yè)企業(yè)等一起合作推出的方案,但并未作為國(guó)家標(biāo)準(zhǔn)發(fā)布,,只是一個(gè)事實(shí)上的標(biāo)準(zhǔn),,一個(gè)過渡方案,為GB18030標(biāo)準(zhǔn)作的一個(gè)準(zhǔn)備,。 首字節(jié)(lead byte)下面是Windows Code page: 936 (GBK),,第一字節(jié)的概況(來自http://msdn.microsoft.com/en-US/goglobal/cc305153.aspx)
1. 上面部分是兼容ASCII單字節(jié)編碼,。 2. 下面陰影部分是雙字節(jié)編碼中的第一個(gè)字節(jié),,表中作為超鏈接,可以點(diǎn)擊進(jìn)去查看具體內(nèi)容,。
第二字節(jié)前面說到“啊”的機(jī)內(nèi)碼是B0A1,,我們點(diǎn)擊B0(上圖中紅色小框部分)去查看一下(來自http://msdn.microsoft.com/en-US/goglobal/gg675356): 1. “啊”位于A1處,,所以它是兼容GB2312的,。而前面的那些字符就是GBK擴(kuò)展的了。
2. 第二字節(jié)從0x40開始,不是從0x00也不是從0x80開始,。表格只有12行,。
3. 另外0x7F和0xFF兩處保留未定義。
GBK還是UTF-8?GBK使用兩字節(jié)保存中文,,也能兼容ASCII,,而對(duì)常用漢字,UTF-8都是采用三字節(jié)編碼,,因此無論是全中文還是中英文混合的情況,,GBK保存的效率都要好于UTF-8.
但它也有些不好的地方,,比如它不能支持一些國(guó)際性的文字,,在國(guó)際化,,通用性方面它肯定不如UTF-8;就漢字而言,,由于容量空間的限制,,它也無法收錄更多的漢字了。
GB18030GB18030前后發(fā)布了兩個(gè)標(biāo)準(zhǔn),,最新的是2005年發(fā)布的GB 18030-2005(《信息技術(shù) 中文編碼字符集》),,2000年還有一版GB18030-2000,更多了解可參考百度百科http://baike.baidu.com/view/889058.htm,,官網(wǎng)見http://gbread.sac.gov.cn/bzzyReadWebApp/standardresources.action?m=readFile&bzNum=GB 18030-2005&flag=1,,(注:這個(gè)文件比較大) 對(duì)于多數(shù)用戶而言,,無需了解太多,這里也不打算詳細(xì)介紹,,下面是一些簡(jiǎn)介(針對(duì)最新的GB18030-2005):
對(duì)于普通用戶,,超大字符集很少用到,,通常情況下,如Windows系統(tǒng)下你可能要安裝GB18030的相關(guān)插件才能處理及顯示那些增補(bǔ)的字符,,一般系統(tǒng)默認(rèn)情況也不會(huì)安裝能支持完整顯示GB18030全體字符的字體,。
關(guān)于GB系列的編碼就說到這里。 |
|