字符編碼總結(jié)_第1頁(yè)
字符編碼總結(jié)_第2頁(yè)
字符編碼總結(jié)_第3頁(yè)
字符編碼總結(jié)_第4頁(yè)
字符編碼總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、字符編碼總結(jié)目 錄引言31字符編碼簡(jiǎn)介41.1字符編碼模型41.2名詞解釋51.2.1SBCS、DBCS和MBCS51.2.2big endian和little endian51.3常見(jiàn)字符集介紹51.3.1ASCII51.3.2擴(kuò)展ASCII61.3.3GB231261.3.4GBK71.3.5GB18030101.3.6BIG5101.3.7各種字符集總結(jié)131.4Windows對(duì)于字符集的解決方法141.4.1代碼頁(yè)141.4.2區(qū)域和ANSI代碼頁(yè)141.4.3代碼頁(yè)轉(zhuǎn)換表152Unicode172.1Unicode簡(jiǎn)介172.1.1問(wèn)題的來(lái)由172.1.2Unicode172.1.3

2、UCS172.1.4Unicode和UCS的關(guān)系172.2Unicode的編碼和實(shí)現(xiàn)172.2.1Unicode的編碼方式172.3Unicode的實(shí)現(xiàn)方式182.3.1UTF-16182.3.2UTF-32192.3.3UTF-8202.3.4BOM202.4Unicode的其他資料212.4.1UCD212.4.2Unicode中的漢字312.4.3UCS的實(shí)現(xiàn)級(jí)別322.4.4Unicode和ISO 10646的關(guān)系322.4.5Unicode和ISO 10646的異同32引言u(píng) 編寫(xiě)目的u 定義在正文中將詳細(xì)介紹。u 參考資料fmddlmyy撰寫(xiě)的淺談文字編碼和Unicode維基百科其

3、他網(wǎng)絡(luò)資料1 字符編碼簡(jiǎn)介計(jì)算機(jī)可以在屏幕上顯示字符,這些字符可以是字母,標(biāo)點(diǎn)符號(hào),數(shù)字,漢字等。計(jì)算機(jī)只認(rèn)識(shí)二進(jìn)制數(shù),所以也只能用二進(jìn)制數(shù)來(lái)表示每個(gè)顯示和輸出的字符。為了使計(jì)算機(jī)的數(shù)據(jù)能夠共享和傳遞,必須對(duì)字符進(jìn)行相應(yīng)的二進(jìn)制編碼。1.1 字符編碼模型 Peter Constable在他的文章"Character set encoding basics Understanding character set encodings and legacy encodings"中描述了字符編碼的四層模型。我覺(jué)得這種說(shuō)法確實(shí)可以更清晰地展現(xiàn)字符編碼中發(fā)生的事情,所以在這里也介紹一下

4、。 第一層 字符的范圍(Abstract character repertoire)設(shè)計(jì)字符編碼的第一層就是確定字符的范圍,即要支持哪些字符。有些編碼方案的字符范圍是固定的,例如ASCII、ISO 8859 系列。有些編碼方案的字符范圍是開(kāi)放的,例如Unicode的字符范圍就是世界上所有的字符。第二層 用數(shù)字表示字符(Coded character set)設(shè)計(jì)字符編碼的第二層是將字符和數(shù)字對(duì)應(yīng)起來(lái)??梢詫⑦@個(gè)層次理解成數(shù)學(xué)家(即從數(shù)學(xué)角度)看到的字符編碼。數(shù)學(xué)家看到的字符編碼是一個(gè)正整數(shù)。例如在Unicode中:漢字“字”對(duì)應(yīng)的數(shù)字是23383。漢字“”對(duì)應(yīng)的數(shù)字是134192。在寫(xiě)html

5、文件時(shí),可以通過(guò)輸入"字"來(lái)插入字符“字”。不過(guò)在設(shè)計(jì)字符編碼時(shí),我們還是習(xí)慣用16進(jìn)制表示數(shù)字。即將23383寫(xiě)成0x5BD7,將134192寫(xiě)成0x20C30。第三層 用基本數(shù)據(jù)類型表示字符(Character encoding form)設(shè)計(jì)字符編碼的第三層是用編程語(yǔ)言中的基本數(shù)據(jù)類型來(lái)表示字符。可以將這個(gè)層次理解成程序員看到的字符編碼。在Unicode中,我們有很多方式將數(shù)字23383表示成程序中的數(shù)據(jù),包括:UTF-8、UTF-16、UTF-32。例如,“漢字”對(duì)應(yīng)的數(shù)字是0x6c49和0x5b57,而編碼的程序數(shù)據(jù)是:BYTE data_u

6、tf8=0xE6,0xB1,0x89,0xE5,0xAD,0x97; / UTF-8編碼WORD data_utf16=0x6c49,0x5b57;                            / UTF-16編碼DWORD data_utf32=0x6c49,0x5b57;   

7、0;                     / UTF-32編碼這里用BYTE、WORD、DWORD分別表示無(wú)符號(hào)8位整數(shù),無(wú)符號(hào)16位整數(shù)和無(wú)符號(hào)32位整數(shù)。UTF-8、UTF-16、UTF-32分別以BYTE、WORD、DWORD作為編碼單位?!皾h字”的UTF-8編碼需要6個(gè)字節(jié)?!皾h字”的UTF-16編碼需要兩個(gè)WORD,大小是4個(gè)字節(jié)?!皾h字”的UTF-32編碼需要兩個(gè)DWORD,大小是

8、8個(gè)字節(jié)。第四層 作為字節(jié)流的字符(Character encoding scheme)字符編碼的第四層是計(jì)算機(jī)看到的字符,即在文件或內(nèi)存中的字節(jié)流。例如,“字”的UTF-32編碼是0x5b57,如果用little endian表示,字節(jié)流是“57 5b 00 00”。如果用big endian表示,字節(jié)流是“00 00 5b 57”。字符編碼的第三層規(guī)定了一個(gè)字符的編碼單位以及編碼單位的順序。字符編碼的第四層在第三層的基礎(chǔ)上又考慮了編碼單位內(nèi)部的字節(jié)序。UTF-8的編碼單位是字節(jié),不受字節(jié)序的影響。UTF-16、UTF-32根據(jù)字節(jié)序的不同,又衍生出UTF-16LE、UTF-16BE、UTF

9、-32LE、UTF-32BE四種編碼方案。LE和BE分別是Little Endian和Big Endian的縮寫(xiě)。小結(jié)通過(guò)四層模型,我們把字符編碼中發(fā)生的這些事情梳理了一遍。其實(shí)大多數(shù)字符集都不需要完整的四層模型,例如GB18030以字節(jié)為編碼單位,直接規(guī)定了字節(jié)序列和字符的映射關(guān)系,跳過(guò)了第二層,也不需要第四層。1.2 名詞解釋1.2.1 SBCS、DBCS和MBCSSBCS、DBCS和MBCS分別是單字節(jié)字符集、雙字節(jié)字符集和多字節(jié)字符集的縮寫(xiě)。SBCS、DBCS和MBCS的最大編碼長(zhǎng)度分別是1字節(jié)、兩字節(jié)和大于兩字節(jié)(例如4或5字節(jié))。單字節(jié)字符集中的字符都用一個(gè)字節(jié)表示。顯然,SBCS

10、最多只能容納256個(gè)字符。ASCII字符集就是單字節(jié)字符集的一個(gè)典型例子。雙字節(jié)字符集的字符用一個(gè)或兩個(gè)字節(jié)表示。GBK字符集就是單字節(jié)字符集的一個(gè)典型例子。多字節(jié)字符集的字符用多個(gè)(多于兩個(gè))字節(jié)表示。UTF-8、GB18030都是多字節(jié)字符集。1.2.2 big endian和little endianbig endian和little endian是CPU處理多字節(jié)數(shù)的不同方式。例如“漢”字的Unicode編碼是6C49。那么寫(xiě)到文件里時(shí),究竟是將6C寫(xiě)在前面,還是將49寫(xiě)在前面?如果將6C寫(xiě)在前面,就是big endian。如果將49寫(xiě)在前面,就是little endian?!癳ndi

11、an”這個(gè)詞出自格列佛游記。小人國(guó)的內(nèi)戰(zhàn)就源于如下?tīng)?zhēng)論:吃雞蛋時(shí)是究竟從大頭(Big-Endian)敲開(kāi)還是從小頭(Little-Endian)敲開(kāi)?由此曾發(fā)生過(guò)六次叛亂,一個(gè)皇帝送了命,另一個(gè)丟了王位。我們一般將endian翻譯成“字節(jié)序”,將big endian和little endian稱作“大端”和“小端”。1.3 常見(jiàn)字符集介紹1.3.1 ASCII上個(gè)世紀(jì)60年代,美國(guó)制定了一套字符編碼,對(duì)英語(yǔ)字符與二進(jìn)制位之間的關(guān)系,做了統(tǒng)一規(guī)定。這被稱為ASCII碼,一直沿用至今。ASCII碼一共規(guī)定了128個(gè)字符的編碼,比如空格"SPACE"是32(二進(jìn)制00100000

12、),大寫(xiě)的字母A是65(二進(jìn)制01000001)。這128個(gè)符號(hào)(包括32個(gè)不能打印出來(lái)的控制符號(hào)),只占用了一個(gè)字節(jié)的后面7位,最前面的1位統(tǒng)一規(guī)定為0。1.3.2 擴(kuò)展ASCII英語(yǔ)用128個(gè)符號(hào)編碼就夠了,但是用來(lái)表示其他語(yǔ)言,128個(gè)符號(hào)是不夠的。比如,在法語(yǔ)中,字母上方有注音符號(hào),它就無(wú)法用ASCII碼表示。于是,一些歐洲國(guó)家就決定,利用字節(jié)中閑置的最高位編入新的符號(hào)。比如,法語(yǔ)中的é的編碼為130(二進(jìn)制10000010)。這樣一來(lái),這些歐洲國(guó)家使用的編碼體系,可以表示最多256個(gè)符號(hào)。但是,這里又出現(xiàn)了新的問(wèn)題。不同的國(guó)家有不同的字母,因此,哪怕它們都使用256個(gè)符號(hào)的

13、編碼方式,代表的字母卻不一樣。比如,130在法語(yǔ)編碼中代表了é,在希伯來(lái)語(yǔ)編碼中卻代表了字母Gimel (),在俄語(yǔ)編碼中又會(huì)代表另一個(gè)符號(hào)。但是不管怎樣,所有這些編碼方式中,0-127表示的符號(hào)是一樣的,不一樣的只是128-255的這一段。1.3.3 GB2312GB2312碼是中華人民共和國(guó)國(guó)家漢字信息交換用編碼,全稱信息交換用漢字編碼字符集-基本集,由國(guó)家標(biāo)準(zhǔn)總局發(fā)布,1981年5月1日實(shí)施,通行于大陸。新加坡等地也使用此編碼。GB2312收錄簡(jiǎn)化漢字及符號(hào)、字母、日文假名等共7445個(gè)圖形字符,其中漢字占6763個(gè)。GB2312規(guī)定“對(duì)任意一個(gè)圖形字符都采用兩個(gè)字節(jié)表示,每個(gè)

14、字節(jié)均采用七位編碼表示”,習(xí)慣上稱第一個(gè)字節(jié)為“高字節(jié)”,第二個(gè)字節(jié)為“低字節(jié)”。包含了大部分常用的一、二級(jí)漢字,和9區(qū)的符號(hào)。該字符集是幾乎所有的中文系統(tǒng)和國(guó)際化的軟件都支持的中文字符集,這也是最基本的中文字符集。其編碼范圍是高位0xa10xfe,低位也是0xa1-0xfe;漢字從0xb0a1開(kāi)始,結(jié)束于0xf7fe。GB2312將代碼表分為94個(gè)區(qū),對(duì)應(yīng)第一字節(jié)(0xa1-0xfe);每個(gè)區(qū)94個(gè)位(0xa1-0xfe),對(duì)應(yīng)第二字節(jié),因此也稱為區(qū)位碼。01-09區(qū)為符號(hào)、數(shù)字區(qū),16-87區(qū)為漢字區(qū)(0xb0-0xf7),10-15區(qū)、88-94區(qū)是有待進(jìn)一步標(biāo)準(zhǔn)化的空白區(qū)。GB2312

15、將收錄的漢字分成兩級(jí):第一級(jí)是常用漢字計(jì)3755個(gè),置于16-55區(qū),按漢語(yǔ)拼音字母/筆形順序排列;第二級(jí)漢字是次常用漢字計(jì)3008個(gè),置于56-87區(qū),按部首/筆畫(huà)順序排列。故而GB2312最多能表示6763個(gè)漢字。GB2312在字符編碼模型的第二層如下圖所示:圖1-1 GB2312在字符編碼模型的第二層具體分體參見(jiàn)下圖:圖1-2 GB2312的具體分區(qū)1.3.4 GBKGB2312 僅收漢字 6763 個(gè),這大大少于現(xiàn)有漢字,隨著時(shí)間推移及漢字文化的不斷延伸推廣,有些原來(lái)很少用的字,現(xiàn)在變成了常用字。為了解決這些問(wèn)題,以及配合 UNICODE 的實(shí)施,全國(guó)信息技術(shù)化技術(shù)委員會(huì)于1995年1

16、2月1日漢字內(nèi)碼擴(kuò)展規(guī)范。GBK 向下與 GB2312 完全兼容,向上支持 ISO 10646 國(guó)際標(biāo)準(zhǔn),在前者向后者過(guò)渡過(guò)程中起到的承上啟下的作用。GBK 亦采用雙字節(jié)表示,總體編碼范圍為 8140-FEFE 之間,首字節(jié)在 81-FE 之間,尾字節(jié)在 40-FE 之間,剔除 XX7F 一條線。GBK 共收入 21886 個(gè)漢字和圖形符號(hào),包括:Ø GB2312 中的全部漢字、非漢字符號(hào)。Ø BIG5 中的全部漢字。Ø 與 ISO 10646 相應(yīng)的國(guó)家標(biāo)準(zhǔn) GB13000 中的其它 CJK 漢字,以上合計(jì) 20902 個(gè)漢字。Ø 其它漢字、部首、符號(hào)

17、,共計(jì) 984 個(gè)。GBK 編碼區(qū)分三部分:Ø 漢字區(qū),包括:u GBK/2:OXBOA1-F7FE, 收錄 GB2312 漢字 6763 個(gè),按原序排列; u GBK/3:OX8140-AOFE,收錄 CJK 漢字 6080 個(gè); u GBK/4:OXAA40-FEAO,收錄 CJK 漢字和增補(bǔ)的漢字 8160 個(gè)。Ø 圖形符號(hào)區(qū),包括:u GBK/1:OXA1A1-A9FE,除 GB2312 的符號(hào)外,還增補(bǔ)了其它符號(hào) u GBK/5:OXA840-A9AO,擴(kuò)除非漢字區(qū)。Ø 用戶自定義區(qū):u 即 GBK 區(qū)域中的空白區(qū),用戶可以自己定義字符。GBK和GB23

18、12都是雙字節(jié)等寬編碼,如果算上和ASCII兼容所支持的單字節(jié),也可以理解為是單字節(jié)和雙字節(jié)混合的變長(zhǎng)編碼。那么我們從文本數(shù)據(jù)中讀到一個(gè)字節(jié)時(shí),怎么判斷它是單字節(jié)字符,還是雙字節(jié)字符的首字符?答案是通過(guò)字節(jié)所處范圍來(lái)判斷。例如:在GBK編碼中,單字節(jié)字符的范圍是0x00-0x7F,雙字節(jié)字符首字節(jié)的范圍是0x81到0xFE。我們順序讀取字節(jié)數(shù)據(jù),如果讀到的字節(jié)在0x81到0xFE內(nèi),那么這個(gè)字節(jié)就是雙字節(jié)字符的首字節(jié)。GBK在字符編碼模型的第二層如下圖所示:圖1-3 GBK在字符編碼模型的第二層具體分體參見(jiàn)下圖:圖1-4 GBK的具體分區(qū)1.3.5 GB18030GB18030編碼向下兼容GB

19、K和GB2312,兼容的含義是不僅字符兼容,而且相同字符的編碼也相同。GB18030收錄了所有Unicode3.1中的字符,包括中國(guó)少數(shù)民族字符,GBK不支持的韓文字符等等,也可以說(shuō)是世界大多民族的文字符號(hào)都被收錄在內(nèi)。 GB18030編碼是變長(zhǎng)編碼,有單字節(jié)、雙字節(jié)和四字節(jié)三種方式。GB18030 的單字節(jié)編碼范圍是0x00-0x7F,完全等同與ASCII;雙字節(jié)編碼的范圍和GBK相同,高字節(jié)是0x81-0xFE,低字節(jié)的編碼范圍是0x40 -0x7E和0x80-FE;四字節(jié)編碼中第一、三字節(jié)的編碼范圍是0x81-0xFE,二、四字節(jié)是0x30-0x39。GB18030是多字節(jié)字符

20、集,它的字符可以用一個(gè)、兩個(gè)或四個(gè)字節(jié)表示。這時(shí)我們又如何判斷一個(gè)字節(jié)是屬于單字節(jié)字符,雙字節(jié)字符,還是四字節(jié)字符?GB18030與GBK是兼容的,它利用了GBK雙字節(jié)字符尾字節(jié)的未使用碼位。GB18030的四字節(jié)字符的第一字節(jié)的范圍也是0x81到0xFE,第二字節(jié)的范圍是0x30-0x39。通過(guò)第二字節(jié)所處范圍就可以區(qū)分雙字節(jié)字符和四字節(jié)字符。GB18030定義四字節(jié)字符的第三字節(jié)范圍是0x81到0xFE,第四字節(jié)范圍是0x30-0x39。1.3.6 BIG5BIG5 是通行于臺(tái)灣、香港地區(qū)的一個(gè)繁體字編碼方案。雖然存在一些瑕疵,但廣泛應(yīng)用于電腦行業(yè),尤其是互聯(lián)網(wǎng)中,從而成為一種事實(shí)上的行業(yè)

21、標(biāo)準(zhǔn)。BIG5 碼是雙字節(jié)編碼方案,其中第一個(gè)字節(jié)的值在 OXA1-OXF9 之間,第二個(gè)字節(jié)在 OX40-OX7E 和 OXA1-OXFE 之間,總計(jì)收入13868個(gè)字 (包括5401個(gè)常用字、7652 個(gè)次常用字、7個(gè)擴(kuò)充字、以及808個(gè)各式符號(hào)),其中可以大致劃分為以下幾個(gè)字區(qū): 表1-1 BIG5字區(qū)與編碼范圍第一字節(jié)第二字節(jié)字區(qū)制定A1.A240.7E, A1.FE各種符號(hào)區(qū)1984A340.7E, A1.BF各種符號(hào)區(qū) (包括標(biāo)點(diǎn)符號(hào)、ASCII 全角符號(hào)、注音符號(hào)等)1984A3E1歐元符號(hào)CP950A4.C540.7E, A1.FE常用字區(qū)1984C640.7E常用字

22、區(qū)1984C6A1.FE罕用符號(hào)區(qū)倚天C740.7E, A1.FE罕用符號(hào)區(qū) (包括日文、俄文等)倚天C840.7E, A1.D3罕用符號(hào)區(qū) (包括俄文、輸入法特殊符號(hào)等)倚天C9.F840.7E, A1.FE次常用字區(qū)1984F940.7E, A1.D5次常用字區(qū)1984F9D6.DC七個(gè)擴(kuò)充字倚天F9DD.FE表格符號(hào)區(qū)倚天BIG5在字符編碼模型的第二層如下圖所示:圖1-5 BIG5在字符編碼模型的第二層具體分體參見(jiàn)下圖:圖1-6 BIG5的具體分區(qū)1.3.7 各種字符集總結(jié)字符集描述字節(jié)數(shù)別名ASCII英文字符1ANSIX3.4ISO-646ISO-8859-1西歐語(yǔ)系1Latin-1I

23、SO-8859-2中歐和東歐語(yǔ)系1Latin-2ISO-8859-3東南歐語(yǔ)系1 Latin-3ISO-8859-4北歐語(yǔ)系1Latin-4ISO-8859-5斯拉夫文1ISO-8859-6阿拉伯文1ISO-8859-7希臘文1ISO-8859-8希伯來(lái)文1ISO-8859-9土耳其文1Latin-5ISO-8859-10拉普人、北歐和愛(ài)斯基摩人的文字1Latin-6ISO-8859-11泰文1ISO-8859-13波羅的海語(yǔ)系1Latin-7ISO-8859-14凱爾特語(yǔ)系1Latin-8ISO-8859-15改進(jìn)的Latin-11Latin-9ISO-8859-16羅馬尼亞文1Latin-

24、10GB2312中文簡(jiǎn)體1-2GBK中文,兼容GB2312,增加了中文繁體,但與BIG不兼容1-2GB18030中文,兼容GBK1-2-4BIG5中文繁體1-2JOHAB韓語(yǔ)13SJIS日語(yǔ)1-21.4 Windows對(duì)于字符集的解決方法1.4.1 代碼頁(yè)代碼頁(yè)(Code Page)是個(gè)古老的專業(yè)術(shù)語(yǔ),據(jù)說(shuō)是IBM公司首先使用的。代碼頁(yè)和字符集的含義基本相同,代碼頁(yè)規(guī)定了適用于特定地區(qū)的字符集合,和這些字符的編碼??梢詫⒋a頁(yè)理解為字符和字節(jié)數(shù)據(jù)的映射表。Windows為自己支持的代碼頁(yè)都編了一個(gè)號(hào)碼。例如代碼頁(yè)936就是簡(jiǎn)體中文 GBK,代碼頁(yè)950就是繁體中文 Big5。代碼頁(yè)的概念比較簡(jiǎn)

25、單,就是一個(gè)字符編碼方案。但要說(shuō)清楚Windows的ANSI代碼頁(yè),就要從Windows的區(qū)域(Locale)說(shuō)起了。 1.4.2 區(qū)域和ANSI代碼頁(yè)微軟為了適應(yīng)世界上不同地區(qū)用戶的文化背景和生活習(xí)慣,在Windows中設(shè)計(jì)了區(qū)域(Locale)設(shè)置的功能。Local是指特定于某個(gè)國(guó)家或地區(qū)的一組設(shè)定,包括代碼頁(yè),數(shù)字、貨幣、時(shí)間和日期的格式等。在Windows內(nèi)部,其實(shí)有兩個(gè)Locale設(shè)置:系統(tǒng)Locale和用戶Locale。系統(tǒng)Locale決定代碼頁(yè),用戶Locale決定數(shù)字、貨幣、時(shí)間和日期的格式。我們可以在控制面板的“區(qū)域和語(yǔ)言選項(xiàng)”中設(shè)置系統(tǒng)Locale和用戶Locale:每個(gè)L

26、ocale都有一個(gè)對(duì)應(yīng)的代碼頁(yè)。系統(tǒng)Locale對(duì)應(yīng)的代碼頁(yè)被作為Windows的默認(rèn)代碼頁(yè)。在沒(méi)有文本編碼信息時(shí),Windows按照默認(rèn)代碼頁(yè)的編碼方案解釋文本數(shù)據(jù)。這個(gè)默認(rèn)代碼頁(yè)通常被稱作ANSI代碼頁(yè)(ACP)。ANSI代碼頁(yè)還有一層意思,就是微軟自己定義的代碼頁(yè)。在歷史上,IBM的個(gè)人計(jì)算機(jī)和微軟公司的操作系統(tǒng)曾經(jīng)是PC的標(biāo)準(zhǔn)配置。微軟公司將IBM公司定義的代碼頁(yè)稱作OEM代碼頁(yè),在IBM公司的代碼頁(yè)基礎(chǔ)上作了些增補(bǔ)后,作為自己的代碼頁(yè),并冠以ANSI的字樣。我們?cè)凇皡^(qū)域和語(yǔ)言選項(xiàng)”高級(jí)頁(yè)面的代碼頁(yè)轉(zhuǎn)換表中看到的包含ANSI字樣的代碼頁(yè)都是微軟自己定義的代碼頁(yè)。例如:874 (ANSI

27、/OEM - 泰文) 932 (ANSI/OEM - 日文 Shift-JIS) 936 (ANSI/OEM - 簡(jiǎn)體中文 GBK) 949 (ANSI/OEM - 韓文) 950 (ANSI/OEM - 繁體中文 Big5) 1250 (ANSI - 中歐) 1251 (ANSI - 西里爾文) 1252 (ANSI - 拉丁文 I) 1253 (ANSI - 希臘文) 1254 (ANSI - 土耳其文) 1255 (ANSI - 希伯來(lái)文) 1256 (ANSI - 阿拉伯文) 1257 (ANSI - 波羅的海文) 1258 (ANSI/OEM - 越南) 1.4.3 代碼頁(yè)轉(zhuǎn)換表在W

28、indows 2000以后,Windows統(tǒng)一采用UTF-16作為內(nèi)部字符編碼?,F(xiàn)在,安裝一個(gè)代碼頁(yè)就是安裝一張代碼頁(yè)轉(zhuǎn)換表。通過(guò)代碼頁(yè)轉(zhuǎn)換表,Windows既可以將代碼頁(yè)的編碼轉(zhuǎn)換到UTF-16,也可以將UTF-16轉(zhuǎn)換到代碼頁(yè)的編碼。代碼頁(yè)轉(zhuǎn)換表的具體實(shí)現(xiàn)可以是一個(gè)以nls為后綴的數(shù)據(jù)文件,也可以是一個(gè)提供轉(zhuǎn)換函數(shù)的動(dòng)態(tài)鏈接庫(kù)。有的代碼頁(yè)是不需要安裝的。例如:Windows將UTF-7和UTF-8分別作為代碼頁(yè)65000和代碼頁(yè)65001。UTF-7、UTF-8和UTF-16都是基于Unicode的編碼方案。它們之間可以通過(guò)簡(jiǎn)單的算法直接轉(zhuǎn)換,不需要安裝代碼頁(yè)轉(zhuǎn)換表。在安裝過(guò)一個(gè)代碼頁(yè)后,

29、Windows就知道怎樣將該代碼頁(yè)的文本轉(zhuǎn)換到Unicode文本,也知道怎樣將Unicode文本轉(zhuǎn)換成該代碼頁(yè)的文本。例如:UniToy有導(dǎo)入和導(dǎo)出功能。所謂導(dǎo)入功能就是將任一代碼頁(yè)的文本文件轉(zhuǎn)換到Unicode文本;導(dǎo)出功能就是將Unicode文本轉(zhuǎn)換到任一指定的代碼頁(yè)。這里所說(shuō)的代碼頁(yè)就是指系統(tǒng)已安裝的代碼頁(yè):其實(shí),如果全世界人民在計(jì)算機(jī)剛發(fā)明時(shí)就統(tǒng)一采用Unicode作為字符編碼,那么代碼頁(yè)就沒(méi)有存在的必要了??上г赨nicode被發(fā)明前,世界各國(guó)人民都發(fā)明并使用了各種字符編碼方案。所以,Windows必須通過(guò)代碼頁(yè)支持已經(jīng)被廣泛使用的字符編碼。從這種意義看,代碼頁(yè)主要是為了兼容現(xiàn)有的數(shù)

30、據(jù)、程序和習(xí)慣而存在的。2 Unicode2.1 Unicode簡(jiǎn)介2.1.1 問(wèn)題的來(lái)由世界上存在著多種編碼方式,同一個(gè)二進(jìn)制數(shù)字可以被解釋成不同的符號(hào)。因此,要想打開(kāi)一個(gè)文本文件,就必須知道它的編碼方式,否則用錯(cuò)誤的編碼方式解讀,就會(huì)出現(xiàn)亂碼。為什么電子郵件常常出現(xiàn)亂碼?就是因?yàn)榘l(fā)信人和收信人使用的編碼方式不一樣。可以想象,如果有一種編碼,將世界上所有的符號(hào)都納入其中。每一個(gè)符號(hào)都給予一個(gè)獨(dú)一無(wú)二的編碼,那么亂碼問(wèn)題就會(huì)消失。于是人們就開(kāi)始了這種嘗試并最終得到了兩套標(biāo)準(zhǔn):Unicode和UCS。2.1.2 UnicodeUnicode協(xié)會(huì)制定的編碼機(jī)制, 要將全世界常

31、用文字都函括進(jìn)去。2.1.3 UCS國(guó)際標(biāo)準(zhǔn)化組織ISO制定的ISO10646標(biāo)準(zhǔn)所定義的 Universal Character Set(全稱 Universal Multiple-Octet Coded Character Set )。2.1.4 Unicode和UCS的關(guān)系國(guó)際標(biāo)準(zhǔn)化組織ISO與Unicode協(xié)會(huì)是兩個(gè)不同的組織, 因此最初制定了不同的標(biāo)準(zhǔn); 但自從unicode2.0開(kāi)始, unicode采用了與ISO 10646-1相同的字庫(kù)和字碼, ISO也承諾ISO10646將不會(huì)給超出0x10FFFF的UC

32、S-4編碼賦值, 使得兩者保持一致。2.2 Unicode的編碼和實(shí)現(xiàn)大概來(lái)說(shuō),Unicode 編碼系統(tǒng)可分為編碼方式和實(shí)現(xiàn)方式兩個(gè)層次。2.2.1 Unicode的編碼方式Unicode的編碼方式對(duì)應(yīng)于字符編碼模型的第二層。 UCS的編碼方式UCS共有兩種編碼方式標(biāo)準(zhǔn):UCS-2和UCS-4。Ø UCS-2UCS-2用兩個(gè)字節(jié)編碼,共有216=65536個(gè)碼位Ø UCS-4UCS-4用4個(gè)字節(jié)(實(shí)際上只用了31位,最高位必須為0)編碼,共有231=2147483648個(gè)碼位。UCS-4根據(jù)最高位為0的最高字節(jié)分成27=128個(gè)group。每個(gè)group再根據(jù)

33、次高字節(jié)分為256個(gè)plane。每個(gè)plane根據(jù)第3個(gè)字節(jié)分為256行 (rows),每行包含256個(gè)cells。group 0的plane 0被稱作Basic Multilingual Plane, 即BMP?;蛘哒f(shuō)UCS-4中,高兩個(gè)字節(jié)為0的碼位被稱作BMP。參見(jiàn)圖2-1。圖2-1 UCS-4中的group,plane,row,cell以及BMP將UCS-4的BMP去掉前面的兩個(gè)零字節(jié)就得到了UCS-2。在UCS-2的兩個(gè)字節(jié)前加上兩個(gè)零字節(jié),就得到了UCS-4的BMP。 Unicode的編碼方式目前實(shí)際應(yīng)用的 Unicode 編碼方式版本對(duì)應(yīng)于 UCS-2,使用16位的

34、編碼空間。也就是每個(gè)字符占用2個(gè)字節(jié)。這樣理論上一共最多可以表示 216 即 65536 個(gè)字符?;緷M足各種語(yǔ)言的使用。實(shí)際上目前版本的 Unicode 尚未填充滿這16位編碼,保留了大量空間作為特殊使用或?qū)?lái)擴(kuò)展。這種編碼方式構(gòu)成了BMP。最新(但未實(shí)際廣泛使用)的 Unicode編碼方式版本在BMP之外定義了16個(gè)輔助平面,兩者合起來(lái)至少需要占據(jù)21位的編碼空間,比3字節(jié)略少。但事實(shí)上輔助平面字符仍然占用4字節(jié)編碼空間,與 UCS-4 保持一致。未來(lái)版本會(huì)擴(kuò)充到 ISO 10646-1 實(shí)現(xiàn)級(jí)別3,即涵蓋 UCS-4 的所有字符。2.3 Unicode的實(shí)現(xiàn)方式Unicode 的實(shí)現(xiàn)方式

35、不同于編碼方式。一個(gè)字符的 Unicode 編碼是確定的。但是在實(shí)際傳輸過(guò)程中,由于不同系統(tǒng)平臺(tái)的設(shè)計(jì)不一定一致,以及出于節(jié)省空間的目的,對(duì) Unicode 編碼的實(shí)現(xiàn)方式有所不同。Unicode 的實(shí)現(xiàn)方式稱為UTF(Unicode Translation Format)。2.3.1 UTF- 編碼規(guī)則UTF-16編碼以16位無(wú)符號(hào)整數(shù)為單位。我們把Unicode編碼記作U。編碼規(guī)則如下:如果U<0x10000,U的UTF-16編碼就是U對(duì)應(yīng)的16位無(wú)符號(hào)整數(shù)(為書(shū)寫(xiě)簡(jiǎn)便,下文將16位無(wú)符號(hào)整數(shù)記作WORD)。 如果U0x10000,我們先計(jì)算U'=U-0x1

36、0000,然后將U'寫(xiě)成二進(jìn)制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16編碼(二進(jìn)制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。 為什么U'可以被寫(xiě)成20個(gè)二進(jìn)制位?Unicode的最大碼位是0x10ffff,減去0x10000后,U'的最大值是0xfffff,所以肯定可以用20個(gè)二進(jìn)制位表示。例如:“”字的Unicode編碼是0x20C30,減去0x10000后,得到0x10C30,寫(xiě)成二進(jìn)制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就

37、得到:1101100001000011 1101110000110000,即0xD843DC30。 代理區(qū)(Surrogate)按照上述規(guī)則,Unicode編碼0x10000-0x10FFFF的UTF-16編碼有兩個(gè)word,第一個(gè)word的高6位是110110,第二個(gè)WORD的高6位是110111??梢?jiàn),第一個(gè)WORD的取值范圍(二進(jìn)制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二個(gè)WORD的取值范圍(二進(jìn)制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。為

38、了將一個(gè)WORD的UTF-16編碼與兩個(gè)WORD的UTF-16編碼區(qū)分開(kāi)來(lái),Unicode編碼的設(shè)計(jì)者將0xD800-0xDFFF保留下來(lái),并稱為代理區(qū)(Surrogate):D800DB7FHigh Surrogates高位替代DB80DBFFHigh Private Use Surrogates高位專用替代DC00DFFFLow Surrogates低位替代高位替代就是指這個(gè)范圍的碼位是兩個(gè)WORD的UTF-16編碼的第一個(gè)WORD。低位替代就是指這個(gè)范圍的碼位是兩個(gè)WORD的UTF-16編碼的第二個(gè)WORD。那么,高位專用替代是什么意思?我們來(lái)解答這個(gè)問(wèn)題,順便看看怎么由UTF-16編碼

39、推導(dǎo)Unicode編碼。 解:如果一個(gè)字符的UTF-16編碼的第一個(gè)WORD在0xDB80到0xDBFF之間,那么它的Unicode編碼在什么范圍內(nèi)?我們知道第二個(gè)WORD的取值范圍是0xDC00-0xDFFF,所以這個(gè)字符的UTF-16編碼范圍應(yīng)該是0xDB80 0xDC00到0xDBFF 0xDFFF。我們將這個(gè)范圍寫(xiě)成二進(jìn)制:1101101110000000 11011100 00000000 - 1101101111111111 1101111111111111按照編碼的相反步驟,取出高低WORD的后10位,并拼在一起,得到1110 0000 0000 0000 0000 - 1111

40、 1111 1111 1111 1111即0xe0000-0xfffff,按照編碼的相反步驟再加上0x10000,得到0xf0000-0x10ffff。這就是UTF-16編碼的第一個(gè)WORD在0xdb80到0xdbff之間的Unicode編碼范圍,即平面15和平面16。因?yàn)閁nicode標(biāo)準(zhǔn)將平面15和平面16都作為專用區(qū),所以0xDB80到0xDBFF之間的保留碼位被稱作高位專用替代。2.3.2 UTF-32在UTF-32中,任意一個(gè)字符U所對(duì)應(yīng)的UTF-32編碼就是U對(duì)應(yīng)的32位無(wú)符號(hào)整數(shù)。2.3.3 UTF-8UTF-8以字節(jié)為編碼單位對(duì)Unicode進(jìn)行編碼。從Unicode到UTF-

41、8的編碼方式如下:表2-2 UTF-8的編碼規(guī)則Unicode編碼(16進(jìn)制)UTF-8 字節(jié)流(二進(jìn)制)00000000 - 0000007F0xxxxxxx00000080 - 000007FF110xxxxx 10xxxxxx00000800 - 0000FFFF1110xxxx 10xxxxxx 10xxxxxx00010000 - 0010FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx00200000 - 03FFFFFF111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx04000000 - 7FFFFFFF111

42、1110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx對(duì)于當(dāng)前廣泛使用的Unicode編碼形式(UCS-2),每個(gè)字符對(duì)應(yīng)的UTF-8編碼最多需要用到3個(gè)字節(jié);對(duì)于最新的(還未廣泛使用)的Unicode編碼形式,每個(gè)字符對(duì)應(yīng)的UTF-8編碼最多需要用到4個(gè)字節(jié);而對(duì)于未來(lái)的完全支持UCS-4的Unicode編碼形式,每個(gè)字符對(duì)應(yīng)的UTF-8編碼最多需要用到6個(gè)字節(jié)。UTF-8的特點(diǎn)是對(duì)不同范圍的字符使用不同長(zhǎng)度的編碼。對(duì)于0x00-0x7F之間的字符,UTF-8編碼與ASCII編碼完全相同。UTF-8有以下優(yōu)點(diǎn):Ø 與CPU字節(jié)順序無(wú)關(guān),

43、 可以在不同平臺(tái)之間交流。Ø 容錯(cuò)能力高, 任何一個(gè)字節(jié)損壞后, 最多只會(huì)導(dǎo)致一個(gè)編碼碼位損失, 不會(huì)鏈鎖錯(cuò)誤(如GB碼錯(cuò)一個(gè)字節(jié)就會(huì)整行亂碼) 。2.3.4 BOMUTF-8以字節(jié)為編碼單元,沒(méi)有字節(jié)序的問(wèn)題。UTF-16以兩個(gè)字節(jié)為編碼單元,UTF-32以4個(gè)字節(jié)為編碼單元,在解釋一個(gè)UTF-16或UTF-32文本前,首先要弄清楚每個(gè)編碼單元的字節(jié)序。例如“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節(jié)流“594E”,那么這是“奎”還是“乙”?實(shí)際上此問(wèn)題對(duì)應(yīng)于字符編碼模型的第四層。為了解決這個(gè)問(wèn)題,Unicode規(guī)范引入了

44、BOM。BOM(byte-order mark),即字節(jié)順序標(biāo)記,它是插入到以UTF-8、UTF16或UTF-32編碼Unicode文件開(kāi)頭的特殊標(biāo)記,用來(lái)識(shí)別Unicode文件的編碼類型。對(duì)于UTF-8來(lái)說(shuō),BOM并不是必須的,因?yàn)锽OM用來(lái)標(biāo)記多字節(jié)編碼文件的編碼類型和字節(jié)順序,而UTF-8以字節(jié)作為編碼單元;但可以用BOM來(lái)表明編碼方式。在Unicode編碼中有一個(gè)叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在Unicode中是不存在的字符,所以不應(yīng)該出現(xiàn)在實(shí)際傳輸中。因而利用此字符作為BOM,下表列出了不同編碼所對(duì)

45、應(yīng)的BOM。表2-1 BOMBOMEncodingEF BB BF UTF-8FE FF UTF-16 (big-endian)FF FE UTF-16 (little-endian)00 00 FE FF UTF-32 (big-endian)FF FE 00 00 UTF-32 (little-endian)2.4 Unicode的其他資料2.4.1 UCDUCD是Unicode字符數(shù)據(jù)庫(kù)(Unicode Character Database)的縮寫(xiě)。UCD由一些描述Unicode字符屬性和內(nèi)部關(guān)系的純文本或html文件組成。大家可以在Unicode組織的網(wǎng)站看到UCD的最新版本。 UCD

46、中的文本文件大都是適合于程序分析的Unicode相關(guān)數(shù)據(jù)。其中的html文件解釋了數(shù)據(jù)庫(kù)的組織,數(shù)據(jù)的格式和含義。UCD中最龐大的文件無(wú)疑就是描述漢字屬性的文件Unihan.txt。在UCD 5.0,0中,Unihan.txt文件大小有28,221K字節(jié)。Unihan.txt中包含了很多有參考價(jià)值的索引,例如漢字部首、筆劃、拼音、使用頻度、四角號(hào)碼排序等。這些索引都是基于一些比較權(quán)威的辭典,但大多數(shù)索引只能檢索部分漢字。我介紹UCD的目的主要是為了使用其中的兩個(gè)概念:Block和Script。 BlockUCD中的Blocks.txt將Unicode的碼位分割成一些連續(xù)的Bloc

47、k,并描述了每個(gè)Block的用途:開(kāi)始碼位結(jié)束碼位Block名稱(英文)Block名稱(中文)0000007FBasic Latin基本拉丁字母008000FFLatin-1 Supplement拉丁字母補(bǔ)充-10100017FLatin Extended-A拉丁字母擴(kuò)充-A0180024FLatin Extended-B拉丁字母擴(kuò)充-B025002AFIPA Extensions國(guó)際音標(biāo)擴(kuò)充02B002FFSpacing Modifier Letters進(jìn)格修飾字符0300036FCombining Diacritical Marks組合附加符號(hào)037003FFGreek and Copti

48、c希臘文和哥普特文040004FFCyrillic西里爾文0500052FCyrillic Supplement西里爾文補(bǔ)充0530058FArmenian亞美尼亞文059005FFHebrew希伯來(lái)文060006FFArabic基本阿拉伯文0700074FSyriac敘利亞文0750077FArabic Supplement阿拉伯文補(bǔ)充078007BFThaana塔納文07C007FFNKoN'Ko字母表0900097FDevanagari天成文書(shū)(梵文)098009FFBengali孟加拉文0A000A7FGurmukhi錫克教文0A800AFFGujarati古吉拉特文0B000

49、B7FOriya奧里亞文0B800BFFTamil泰米爾文0C000C7FTelugu泰盧固文0C800CFFKannada卡納達(dá)文0D000D7FMalayalam德拉維族文0D800DFFSinhala僧伽羅文0E000E7FThai泰文0E800EFFLao老撾文0F000FFFTibetan藏文1000109FMyanmar緬甸文10A010FFGeorgian格魯吉亞文110011FFHangul Jamo朝鮮文1200137FEthiopic埃塞俄比亞文1380139FEthiopic Supplement埃塞俄比亞文補(bǔ)充13A013FFCherokee切羅基文1400167FUn

50、ified Canadian Aboriginal Syllabics加拿大印第安方言1680169FOgham歐甘文16A016FFRunic北歐古字1700171FTagalog塔加路文1720173FHanunoo哈努諾文1740175FBuhid布迪文1760177FTagbanwaTagbanwa文178017FFKhmer高棉文180018AFMongolian蒙古文1900194FLimbu林布文1950197FTai Le德宏傣文198019DFNew Tai Lue新傣文19E019FFKhmer Symbols高棉文1A001A1FBuginese布吉文1B001B7FBa

51、linese巴厘文1D001D7FPhonetic Extensions拉丁字母音標(biāo)擴(kuò)充1D801DBFPhonetic Extensions Supplement拉丁字母音標(biāo)擴(kuò)充增補(bǔ)1DC01DFFCombining Diacritical Marks Supplement組合附加符號(hào)補(bǔ)充1E001EFFLatin Extended Additional拉丁字母擴(kuò)充附加1F001FFFGreek Extended希臘文擴(kuò)充2000206FGeneral Punctuation一般標(biāo)點(diǎn)符號(hào)2070209FSuperscripts and Subscripts上標(biāo)和下標(biāo)20A020CFCurre

52、ncy Symbols貨幣符號(hào)20D020FFCombining Diacritical Marks for Symbols符號(hào)用組合附加符號(hào)2100214FLetterlike Symbols似字母符號(hào)2150218FNumber Forms數(shù)字形式219021FFArrows箭頭符號(hào)220022FFMathematical Operators數(shù)學(xué)運(yùn)算符號(hào)230023FFMiscellaneous Technical零雜技術(shù)用符號(hào)2400243FControl Pictures控制圖符2440245FOptical Character Recognition光學(xué)字符識(shí)別246024FFEnc

53、losed Alphanumerics帶括號(hào)的字母數(shù)字2500257FBox Drawing制表符2580259FBlock Elements方塊元素25A025FFGeometric Shapes幾何形狀260026FFMiscellaneous Symbols零雜符號(hào)270027BFDingbats雜錦字型27C027EFMiscellaneous Mathematical Symbols-A零雜數(shù)學(xué)符號(hào)-A27F027FFSupplemental Arrows-A箭頭符號(hào)補(bǔ)充-A280028FFBraille Patterns盲文2900297FSupplemental Arrows-B

54、箭頭符號(hào)補(bǔ)充-B298029FFMiscellaneous Mathematical Symbols-B零雜數(shù)學(xué)符號(hào)-B2A002AFFSupplemental Mathematical Operators數(shù)學(xué)運(yùn)算符號(hào)2B002BFFMiscellaneous Symbols and Arrows零雜符號(hào)和箭頭2C002C5FGlagolitic格拉哥里字母表2C602C7FLatin Extended-C拉丁字母擴(kuò)充-C2C802CFFCoptic科普特文2D002D2FGeorgian Supplement格魯吉亞文補(bǔ)充2D302D7FTifinagh提非納字母2D802DDFEthiopic Extended埃塞俄比亞文擴(kuò)充2E002E7FSupplemental Punctuation標(biāo)點(diǎn)符號(hào)補(bǔ)充2E802EFFCJK Radicals Supplement中日韓部首補(bǔ)充2F002FDFKangxi Radicals康熙字典部首2FF02FFFIdeographic Description Characters漢字結(jié)構(gòu)描述字符3000303FCJK Symbols and Punctuation中日韓符號(hào)和標(biāo)點(diǎn) 3040309FHiragana

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論