久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

深入圖解字符集與字符集編碼(九)

 flysnowxg 2014-12-06

前面的一些篇章更多談?wù)摿薝nicode的相關(guān)話題,,雖然也有提到GBK等編碼,,但都沒細(xì)說,這里打算系統(tǒng)說一下,。GB系列包括GB2312,,GBK,GB18030.

前面已經(jīng)提過,,GB=Guo Biao=國(guó)標(biāo)=國(guó)家標(biāo)準(zhǔn),,至于所謂的2312就是一編號(hào)了,沒有其它特別的意義,,18030類似,。GBK沒有編號(hào),所以它實(shí)際上并不是國(guó)家標(biāo)準(zhǔn),,只是一個(gè)事實(shí)標(biāo)準(zhǔn),,GBK中K指“擴(kuò)展”的意思。

最早的是GB2312,,我們從它開始說起,。

GB2312


以下為一簡(jiǎn)介(官方文檔見:http://gbread.sac.gov.cn/bzzyReadWebApp/standardresources.action?m=readFile&bzNum=GB%202312-1980&flag=1,用IE打開,,它要安裝一個(gè)ActiveX我插呀件~):

GB 2312-1980,,全稱《信息交換用漢字編碼字符集 基本集》,由國(guó)家標(biāo)準(zhǔn)總局于1980年3月9號(hào)發(fā)布,,1981年5月1日實(shí)施,,通行于大陸。新加坡等地也使用此編碼,。它是一個(gè)簡(jiǎn)化字的編碼規(guī)范,,也包括其他的符號(hào)、字母,、日文假名等,,共7445個(gè)圖形字符,其中漢字占6763個(gè),。

上述官網(wǎng)地址無法下載,,如果你想下載,可試下這個(gè)ftp://ftp.oreilly.com/examples/cjkvinfo/AppE/gb2312.pdf(比標(biāo)準(zhǔn)方案多增加了一些字符)

作為一個(gè)編碼字符集而言,,前面也曾說到,,它采用了所謂的二維區(qū)位編號(hào),下面是一個(gè)概覽圖:

image

它是一個(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.

從上圖中可以看到中間有5個(gè)編碼為空白(中間靠右邊部分,,D7FA-D7FE),所以總共有6768-5=6763個(gè)漢字,。

一級(jí)漢字與二級(jí)漢字:

image

第16-55區(qū):一級(jí)漢字,,3755個(gè)(以拼音字母排序)    
第56-87區(qū):二級(jí)漢字,3008個(gè)(以部首筆畫排序)

2. 最下面的88-94區(qū)是有待進(jìn)一步標(biāo)準(zhǔn)化的空白區(qū),。

3. 關(guān)于前面的01-15區(qū),下圖為概覽圖左上角的局部放大圖:

image

1. 01-09區(qū)為符號(hào),、字母,、日文假名等,部分區(qū)還有空白位,。

03區(qū)即是對(duì)應(yīng)ASCII字符的全角字符區(qū),。輸入法的全角模式下輸入的即是這些字符。

2. 10-15區(qū)也是有待進(jìn)一步標(biāo)準(zhǔn)化的空白區(qū),。

各區(qū)的一個(gè)具體情況:

第01區(qū):中文標(biāo)點(diǎn),、數(shù)學(xué)符號(hào)以及一些特殊字符    
第02區(qū):序號(hào)      
第03區(qū):全角西文字符      
第04區(qū):日文平假名      
第05區(qū):日文片假名      
第06區(qū):希臘字母表      
第07區(qū):俄文字母表      
第08區(qū):中文拼音字母表      
第09區(qū):制表符號(hào)      
第10-15區(qū):未定義      
第16-55區(qū):一級(jí)漢字(以拼音字母排序)      
第56-87區(qū):二級(jí)漢字(以部首筆畫排序)      
第88-94區(qū):未定義

區(qū)位碼

在上圖中還標(biāo)出了一個(gè)漢字“啊”,它就是GB2312方案中的天字第一號(hào)漢字,,它處于16區(qū)01位上,,所以它的區(qū)位碼即是1601.

所謂區(qū)位碼就是這一94*94的大表格中的行號(hào)與列號(hào)了,均從1開始編號(hào),。

第一個(gè)字符0101為“全角空格”(圖中顯示為SP(space)),。

國(guó)標(biāo)碼

將區(qū)位碼的區(qū)和位分別加上32(=0x20)就得到了國(guó)標(biāo)碼。

“啊”的區(qū)位碼是16-01,,分別加32,,得到16+32-01+32=48-33,即是國(guó)標(biāo)碼,。當(dāng)然,,你通常應(yīng)該寫成16進(jìn)制,48-33即是0x30-0x21,,所以3021即是“啊”十六進(jìn)制的國(guó)標(biāo)碼,,使用兩字節(jié)保存,30為高字節(jié),,21為低字節(jié),。如下:

image

GB2312方案規(guī)定,,對(duì)上述表中任意一個(gè)圖形字符都采用兩個(gè)字節(jié)表示,每個(gè)字節(jié)均采用七位編碼表示,。

如上圖所示,,只用了7位,這即是說最高位就是0了,。

但為何不直接采用區(qū)位碼呢,?為什么要加32呢?你也許還記得前面說到ASCII時(shí),,前面32個(gè)字符是控制碼,,中文系統(tǒng)自然也不能少了這些控制碼,為了不與這些控制碼沖突,,加上32就能跳過它們了,。

一字節(jié)有128個(gè)空間,128-32=96,,實(shí)際上,,ASCII中第127個(gè)也是控制碼(DEL, 刪除),,再減去就還有95個(gè)有效位,,再加上區(qū)位從1開始,又損失了一位,,所以最終只有94個(gè)有效位了,,這也是前面為何是一個(gè)94*94的表格。

國(guó)標(biāo)碼的定位實(shí)際應(yīng)該是與ASCII一致的,,是作為國(guó)家信息交換的標(biāo)準(zhǔn)碼,。從設(shè)計(jì)上看,它并沒打算兼容ASCII,,它已經(jīng)把ASCII中的字符收錄了過來,,不過是作為所謂的全角字符來看待,但全角英文顯示效果其實(shí)是很差的,,下面是全角英文的一個(gè)示例:

hello,,world

顯得非常不緊湊,最終,,一種能兼容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ū)分開來,。

將“啊”的國(guó)標(biāo)碼3021分別加上0x80,,0x30+0x80=0xB0,0x21+0x80=0xA1,,所以B0A1即是機(jī)內(nèi)碼,。

如果從區(qū)位碼算起,那么則是加上0x20+0x80=32+128=160=0xA0,,也即區(qū)位碼的區(qū)和位分別直接加上0xA0即可得到機(jī)內(nèi)碼,,如下圖所示:

image

如果你新建一個(gè)文本文件,錄入“啊”字,,以GB2312編碼方式保存(使用GBK即可,,它兼容GB2312),再用十六進(jìn)制查看,,你會(huì)發(fā)現(xiàn)使用的是機(jī)內(nèi)碼:

image

使用代碼的測(cè)試也可驗(yàn)證這一點(diǎn):

1
    @Test     public void testAh() throws UnsupportedEncodingException {         String ah = "啊";         assertThat(DatatypeConverter.printHexBinary(ah.getBytes("GB2312"))).isEqualTo("B0A1");     }

雖然我們常把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ū)分,。

自然,,全角英文字符就是兩字節(jié)編碼了,跟漢字是一樣的,。

下面是一個(gè)混合了漢字,,半角字母a和全角字母a的編碼示例,共5個(gè)字節(jié):

image

我們說GB2312是一個(gè)變長(zhǎng)編碼方案,,是站在其兼容ASCII編碼角度而言,,就其方案標(biāo)準(zhǔn)本身定義的字符而言,它是一個(gè)雙字節(jié)定長(zhǎng)編碼方案,。

你可能會(huì)想,,那國(guó)標(biāo)碼還有什么用,?

我個(gè)人覺得,國(guó)標(biāo)碼既然稱為中文信息交換的標(biāo)準(zhǔn)碼,,必然要成為“機(jī)內(nèi)”碼才有意義,,只不過由于各種原因,最終未能如愿,。早期的一些系統(tǒng)或者一些小型的嵌入式系統(tǒng)或許采納了它做為“機(jī)內(nèi)”碼,。當(dāng)然以上為個(gè)人猜測(cè),僅供參考,。

另:我在前面的一些文章中談到區(qū)位碼時(shí)把它與機(jī)內(nèi)碼混為一談,,特此更正。

下面是三種碼在256*256坐標(biāo)中的位置的一個(gè)示意圖:

image

GBK


GBK是對(duì)GB2312的一個(gè)擴(kuò)展,,兼容GB2312,,因此也兼容ASCII,也是一個(gè)變長(zhǎng)編碼方案,。下面是一個(gè)簡(jiǎn)介:

GBK總體編碼范圍為8140-FEFE,,首字節(jié)在81-FE 之間,尾字節(jié)在40-FE 之間,,總計(jì)23940 個(gè)碼位,,共收入21886個(gè)漢字和圖形符號(hào),其中漢字(包括部首和構(gòu)件)21003 個(gè),,圖形符號(hào)883 個(gè),。

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

image

Code page 936實(shí)質(zhì)上是GBK到UTF-16編碼的一個(gè)轉(zhuǎn)換表,圖中字符下面標(biāo)注的四位16進(jìn)制數(shù)字即是UTF-16編碼

1. 上面部分是兼容ASCII單字節(jié)編碼,。

2. 下面陰影部分是雙字節(jié)編碼中的第一個(gè)字節(jié),,表中作為超鏈接,可以點(diǎn)擊進(jìn)去查看具體內(nèi)容,。

注:0x80(=128)被用于歐元符,。(圖中小圓框部分)0xFF則保留,實(shí)際共有128-2=126塊,。

另:新的GB18030標(biāo)準(zhǔn)使用雙字節(jié)編碼歐元符號(hào),,去掉了這個(gè)單字節(jié)編碼。

第二字節(jié)

前面說到“啊”的機(jī)內(nèi)碼是B0A1,,我們點(diǎn)擊B0(上圖中紅色小框部分)去查看一下(來自http://msdn.microsoft.com/en-US/goglobal/gg675356):

image

1. “啊”位于A1處,,所以它是兼容GB2312的,。而前面的那些字符就是GBK擴(kuò)展的了。

“啊”下面的554A即是它的UTF-16編碼,。GBK與UTF-16之間編碼的轉(zhuǎn)換只能通過查表實(shí)現(xiàn),。

2. 第二字節(jié)從0x40開始,不是從0x00也不是從0x80開始,。表格只有12行,。

因?yàn)椴皇菑?x80開始,這意味著第二字節(jié)最高位也可能是0.這點(diǎn)與GB2312不同,,GB2312確保了無論是高低字節(jié)最高位均是1,。

3. 另外0x7F和0xFF兩處保留未定義。

所以實(shí)際有12*16-2=192-2=190個(gè)字符,。注:并非所有的塊里面都是190個(gè)字符,,也有不少是少于190的。

粗略估算可得126*190=23940,,所以GBK也就是兩萬多個(gè)字符這樣子,。

GBK還是UTF-8?

GBK使用兩字節(jié)保存中文,,也能兼容ASCII,,而對(duì)常用漢字,UTF-8都是采用三字節(jié)編碼,,因此無論是全中文還是中英文混合的情況,,GBK保存的效率都要好于UTF-8.

這也不奇怪,畢竟是親生的,。

但它也有些不好的地方,,比如它不能支持一些國(guó)際性的文字,,在國(guó)際化,,通用性方面它肯定不如UTF-8;就漢字而言,,由于容量空間的限制,,它也無法收錄更多的漢字了。

所以,,怎么選擇,,自己看著辦。

GB18030


GB18030前后發(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):

  1. 它也是一個(gè)多字節(jié)編碼方案,,有一,二,,四字節(jié)三種變長(zhǎng)組合,。

  2. 它的編碼空間很大,高達(dá)160萬(約數(shù)),,這甚至超過了Unicode規(guī)定的110萬(約數(shù)),。

  3. 它兼容GB2312,基本兼容GBK(只有很少幾處不同),。

  4. 它收錄高達(dá)7萬多的漢字,,Unicode中的CJK統(tǒng)一漢字,CJK統(tǒng)一漢字?jǐn)U充A,,CJK統(tǒng)一漢字?jǐn)U充B均收錄了進(jìn)來,。

  5. 它還支持許多少數(shù)民族如藏、蒙古,、彝,、維吾爾等的文字。

對(duì)于普通用戶,,超大字符集很少用到,,通常情況下,如Windows系統(tǒng)下你可能要安裝GB18030的相關(guān)插件才能處理及顯示那些增補(bǔ)的字符,,一般系統(tǒng)默認(rèn)情況也不會(huì)安裝能支持完整顯示GB18030全體字符的字體,。

GB18030作為一個(gè)強(qiáng)制標(biāo)準(zhǔn),但由于采用了高達(dá)四字節(jié)的情形,,無論是操作系統(tǒng)還是各種應(yīng)用軟件,,可能涉及許多調(diào)整才能很好地支持,這決不是一件簡(jiǎn)單的事情,。

作為國(guó)際性標(biāo)準(zhǔn)的Unicode,,BMP以外的字符的處理與顯示都還有很多不完善,所以如果GB18030沒有得到很好的支持,,那也不足為奇了,。

關(guān)于GB系列的編碼就說到這里。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多