中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
深入圖解字符集與字符集編碼(九)

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

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

最早的是GB2312,我們從它開(kāi)始說(shuō)起。

GB2312


以下為一簡(jiǎn)介(官方文檔見(jiàn):http://gbread.sac.gov.cn/bzzyReadWebApp/standardresources.action?m=readFile&bzNum=GB%202312-1980&flag=1,用IE打開(kāi),它要安裝一個(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)地址無(wú)法下載,如果你想下載,可試下這個(gè)ftp://ftp.oreilly.com/examples/cjkvinfo/AppE/gb2312.pdf(比標(biāo)準(zhǔn)方案多增加了一些字符)

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

它是一個(gè)94*94的表格,理論上有94*94=8836個(gè)空間。

橫的叫區(qū),豎的叫位,總共94個(gè)區(qū),區(qū)和位的編號(hào)都從1開(kāi)始??梢钥吹酱致杂腥蟛糠帧?/p>

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í)漢字:

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

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

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

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í)漢字(以部首筆畫(huà)排序)      
第88-94區(qū):未定義

區(qū)位碼

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

所謂區(qū)位碼就是這一94*94的大表格中的行號(hào)與列號(hào)了,均從1開(kāi)始編號(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)該寫(xiě)成16進(jìn)制,48-33即是0x30-0x21,所以3021即是“啊”十六進(jìn)制的國(guó)標(biāo)碼,使用兩字節(jié)保存,30為高字節(jié),21為低字節(jié)。如下:

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

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

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

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

國(guó)標(biāo)碼的定位實(shí)際應(yīng)該是與ASCII一致的,是作為國(guó)家信息交換的標(biāo)準(zhǔn)碼。從設(shè)計(jì)上看,它并沒(méi)打算兼容ASCII,它已經(jīng)把ASCII中的字符收錄了過(guò)來(lái),不過(guò)是作為所謂的全角字符來(lái)看待,但全角英文顯示效果其實(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ū)分開(kāi)來(lái)。

將“啊”的國(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)碼,如下圖所示:

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

使用代碼的測(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)碼,通常說(shuō)到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é):

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

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

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

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

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

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)部門(mén)與一些信息行業(yè)企業(yè)等一起合作推出的方案,但并未作為國(guó)家標(biāo)準(zhǔn)發(fā)布,只是一個(gè)事實(shí)上的標(biāo)準(zhǔn),一個(gè)過(guò)渡方案,為GB18030標(biāo)準(zhǔn)作的一個(gè)準(zhǔn)備。

首字節(jié)(lead byte)

下面是Windows Code page: 936 (GBK),第一字節(jié)的概況(來(lái)自http://msdn.microsoft.com/en-US/goglobal/cc305153.aspx

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é)

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

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

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

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

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

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

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

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

GBK還是UTF-8?

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

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

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

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

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)見(jiàn)http://gbread.sac.gov.cn/bzzyReadWebApp/standardresources.action?m=readFile&bzNum=GB 18030-2005&flag=1,(注:這個(gè)文件比較大)

對(duì)于多數(shù)用戶而言,無(wú)需了解太多,這里也不打算詳細(xì)介紹,下面是一些簡(jiǎn)介(針對(duì)最新的GB18030-2005):

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

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

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

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

  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é)的情形,無(wú)論是操作系統(tǒng)還是各種應(yīng)用軟件,可能涉及許多調(diào)整才能很好地支持,這決不是一件簡(jiǎn)單的事情。

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

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

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
第四章 漢字信息處理基礎(chǔ)知識(shí)
計(jì)算機(jī)中字符的表示
刨根究底字符編碼之六——簡(jiǎn)體漢字編碼中區(qū)位碼、國(guó)標(biāo)碼、內(nèi)碼、外碼、字形碼的區(qū)別及關(guān)系
文本與文本處理(一)
機(jī)內(nèi)碼,輸入碼,處理碼,字形碼,區(qū)位碼的定義 - 已解決 - 搜搜問(wèn)問(wèn)
VC 獲取漢字拼音首字母(unicode編碼)上
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服