版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、字符編碼總結(jié)目 錄引言31字符編碼簡介41.1字符編碼模型41.2名詞解釋51.2.1SBCS、DBCS和MBCS51.2.2big endian和little endian51.3常見字符集介紹51.3.1ASCII51.3.2擴展ASCII61.3.3GB231261.3.4GBK71.3.5GB18030101.3.6BIG5101.3.7各種字符集總結(jié)131.4Windows對于字符集的解決方法141.4.1代碼頁141.4.2區(qū)域和ANSI代碼頁141.4.3代碼頁轉(zhuǎn)換表152Unicode172.1Unicode簡介172.1.1問題的來由172.1.2Unicode172.1.3
2、UCS172.1.4Unicode和UCS的關(guān)系172.2Unicode的編碼和實現(xiàn)172.2.1Unicode的編碼方式172.3Unicode的實現(xiàn)方式182.3.1UTF-16182.3.2UTF-32192.3.3UTF-8202.3.4BOM202.4Unicode的其他資料212.4.1UCD212.4.2Unicode中的漢字312.4.3UCS的實現(xiàn)級別322.4.4Unicode和ISO 10646的關(guān)系322.4.5Unicode和ISO 10646的異同32引言u 編寫目的u 定義在正文中將詳細介紹。u 參考資料fmddlmyy撰寫的淺談文字編碼和Unicode維基百科其
3、他網(wǎng)絡(luò)資料1 字符編碼簡介計算機可以在屏幕上顯示字符,這些字符可以是字母,標點符號,數(shù)字,漢字等。計算機只認識二進制數(shù),所以也只能用二進制數(shù)來表示每個顯示和輸出的字符。為了使計算機的數(shù)據(jù)能夠共享和傳遞,必須對字符進行相應(yīng)的二進制編碼。1.1 字符編碼模型 Peter Constable在他的文章"Character set encoding basics Understanding character set encodings and legacy encodings"中描述了字符編碼的四層模型。我覺得這種說法確實可以更清晰地展現(xiàn)字符編碼中發(fā)生的事情,所以在這里也介紹一下
4、。 第一層 字符的范圍(Abstract character repertoire)設(shè)計字符編碼的第一層就是確定字符的范圍,即要支持哪些字符。有些編碼方案的字符范圍是固定的,例如ASCII、ISO 8859 系列。有些編碼方案的字符范圍是開放的,例如Unicode的字符范圍就是世界上所有的字符。第二層 用數(shù)字表示字符(Coded character set)設(shè)計字符編碼的第二層是將字符和數(shù)字對應(yīng)起來。可以將這個層次理解成數(shù)學(xué)家(即從數(shù)學(xué)角度)看到的字符編碼。數(shù)學(xué)家看到的字符編碼是一個正整數(shù)。例如在Unicode中:漢字“字”對應(yīng)的數(shù)字是23383。漢字“”對應(yīng)的數(shù)字是134192。在寫html
5、文件時,可以通過輸入"字"來插入字符“字”。不過在設(shè)計字符編碼時,我們還是習(xí)慣用16進制表示數(shù)字。即將23383寫成0x5BD7,將134192寫成0x20C30。第三層 用基本數(shù)據(jù)類型表示字符(Character encoding form)設(shè)計字符編碼的第三層是用編程語言中的基本數(shù)據(jù)類型來表示字符??梢詫⑦@個層次理解成程序員看到的字符編碼。在Unicode中,我們有很多方式將數(shù)字23383表示成程序中的數(shù)據(jù),包括:UTF-8、UTF-16、UTF-32。例如,“漢字”對應(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分別表示無符號8位整數(shù),無符號16位整數(shù)和無符號32位整數(shù)。UTF-8、UTF-16、UTF-32分別以BYTE、WORD、DWORD作為編碼單位?!皾h字”的UTF-8編碼需要6個字節(jié)?!皾h字”的UTF-16編碼需要兩個WORD,大小是4個字節(jié)?!皾h字”的UTF-32編碼需要兩個DWORD,大小是
8、8個字節(jié)。第四層 作為字節(jié)流的字符(Character encoding scheme)字符編碼的第四層是計算機看到的字符,即在文件或內(nèi)存中的字節(jié)流。例如,“字”的UTF-32編碼是0x5b57,如果用little endian表示,字節(jié)流是“57 5b 00 00”。如果用big endian表示,字節(jié)流是“00 00 5b 57”。字符編碼的第三層規(guī)定了一個字符的編碼單位以及編碼單位的順序。字符編碼的第四層在第三層的基礎(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的縮寫。小結(jié)通過四層模型,我們把字符編碼中發(fā)生的這些事情梳理了一遍。其實大多數(shù)字符集都不需要完整的四層模型,例如GB18030以字節(jié)為編碼單位,直接規(guī)定了字節(jié)序列和字符的映射關(guān)系,跳過了第二層,也不需要第四層。1.2 名詞解釋1.2.1 SBCS、DBCS和MBCSSBCS、DBCS和MBCS分別是單字節(jié)字符集、雙字節(jié)字符集和多字節(jié)字符集的縮寫。SBCS、DBCS和MBCS的最大編碼長度分別是1字節(jié)、兩字節(jié)和大于兩字節(jié)(例如4或5字節(jié))。單字節(jié)字符集中的字符都用一個字節(jié)表示。顯然,SBCS
10、最多只能容納256個字符。ASCII字符集就是單字節(jié)字符集的一個典型例子。雙字節(jié)字符集的字符用一個或兩個字節(jié)表示。GBK字符集就是單字節(jié)字符集的一個典型例子。多字節(jié)字符集的字符用多個(多于兩個)字節(jié)表示。UTF-8、GB18030都是多字節(jié)字符集。1.2.2 big endian和little endianbig endian和little endian是CPU處理多字節(jié)數(shù)的不同方式。例如“漢”字的Unicode編碼是6C49。那么寫到文件里時,究竟是將6C寫在前面,還是將49寫在前面?如果將6C寫在前面,就是big endian。如果將49寫在前面,就是little endian。“endi
11、an”這個詞出自格列佛游記。小人國的內(nèi)戰(zhàn)就源于如下爭論:吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開?由此曾發(fā)生過六次叛亂,一個皇帝送了命,另一個丟了王位。我們一般將endian翻譯成“字節(jié)序”,將big endian和little endian稱作“大端”和“小端”。1.3 常見字符集介紹1.3.1 ASCII上個世紀60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關(guān)系,做了統(tǒng)一規(guī)定。這被稱為ASCII碼,一直沿用至今。ASCII碼一共規(guī)定了128個字符的編碼,比如空格"SPACE"是32(二進制00100000
12、),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只占用了一個字節(jié)的后面7位,最前面的1位統(tǒng)一規(guī)定為0。1.3.2 擴展ASCII英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。比如,在法語中,字母上方有注音符號,它就無法用ASCII碼表示。于是,一些歐洲國家就決定,利用字節(jié)中閑置的最高位編入新的符號。比如,法語中的é的編碼為130(二進制10000010)。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號。但是,這里又出現(xiàn)了新的問題。不同的國家有不同的字母,因此,哪怕它們都使用256個符號的
13、編碼方式,代表的字母卻不一樣。比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (),在俄語編碼中又會代表另一個符號。但是不管怎樣,所有這些編碼方式中,0-127表示的符號是一樣的,不一樣的只是128-255的這一段。1.3.3 GB2312GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱信息交換用漢字編碼字符集-基本集,由國家標準總局發(fā)布,1981年5月1日實施,通行于大陸。新加坡等地也使用此編碼。GB2312收錄簡化漢字及符號、字母、日文假名等共7445個圖形字符,其中漢字占6763個。GB2312規(guī)定“對任意一個圖形字符都采用兩個字節(jié)表示,每個
14、字節(jié)均采用七位編碼表示”,習(xí)慣上稱第一個字節(jié)為“高字節(jié)”,第二個字節(jié)為“低字節(jié)”。包含了大部分常用的一、二級漢字,和9區(qū)的符號。該字符集是幾乎所有的中文系統(tǒng)和國際化的軟件都支持的中文字符集,這也是最基本的中文字符集。其編碼范圍是高位0xa10xfe,低位也是0xa1-0xfe;漢字從0xb0a1開始,結(jié)束于0xf7fe。GB2312將代碼表分為94個區(qū),對應(yīng)第一字節(jié)(0xa1-0xfe);每個區(qū)94個位(0xa1-0xfe),對應(yīng)第二字節(jié),因此也稱為區(qū)位碼。01-09區(qū)為符號、數(shù)字區(qū),16-87區(qū)為漢字區(qū)(0xb0-0xf7),10-15區(qū)、88-94區(qū)是有待進一步標準化的空白區(qū)。GB2312
15、將收錄的漢字分成兩級:第一級是常用漢字計3755個,置于16-55區(qū),按漢語拼音字母/筆形順序排列;第二級漢字是次常用漢字計3008個,置于56-87區(qū),按部首/筆畫順序排列。故而GB2312最多能表示6763個漢字。GB2312在字符編碼模型的第二層如下圖所示:圖1-1 GB2312在字符編碼模型的第二層具體分體參見下圖:圖1-2 GB2312的具體分區(qū)1.3.4 GBKGB2312 僅收漢字 6763 個,這大大少于現(xiàn)有漢字,隨著時間推移及漢字文化的不斷延伸推廣,有些原來很少用的字,現(xiàn)在變成了常用字。為了解決這些問題,以及配合 UNICODE 的實施,全國信息技術(shù)化技術(shù)委員會于1995年1
16、2月1日漢字內(nèi)碼擴展規(guī)范。GBK 向下與 GB2312 完全兼容,向上支持 ISO 10646 國際標準,在前者向后者過渡過程中起到的承上啟下的作用。GBK 亦采用雙字節(jié)表示,總體編碼范圍為 8140-FEFE 之間,首字節(jié)在 81-FE 之間,尾字節(jié)在 40-FE 之間,剔除 XX7F 一條線。GBK 共收入 21886 個漢字和圖形符號,包括:Ø GB2312 中的全部漢字、非漢字符號。Ø BIG5 中的全部漢字。Ø 與 ISO 10646 相應(yīng)的國家標準 GB13000 中的其它 CJK 漢字,以上合計 20902 個漢字。Ø 其它漢字、部首、符號
17、,共計 984 個。GBK 編碼區(qū)分三部分:Ø 漢字區(qū),包括:u GBK/2:OXBOA1-F7FE, 收錄 GB2312 漢字 6763 個,按原序排列; u GBK/3:OX8140-AOFE,收錄 CJK 漢字 6080 個; u GBK/4:OXAA40-FEAO,收錄 CJK 漢字和增補的漢字 8160 個。Ø 圖形符號區(qū),包括:u GBK/1:OXA1A1-A9FE,除 GB2312 的符號外,還增補了其它符號 u GBK/5:OXA840-A9AO,擴除非漢字區(qū)。Ø 用戶自定義區(qū):u 即 GBK 區(qū)域中的空白區(qū),用戶可以自己定義字符。GBK和GB23
18、12都是雙字節(jié)等寬編碼,如果算上和ASCII兼容所支持的單字節(jié),也可以理解為是單字節(jié)和雙字節(jié)混合的變長編碼。那么我們從文本數(shù)據(jù)中讀到一個字節(jié)時,怎么判斷它是單字節(jié)字符,還是雙字節(jié)字符的首字符?答案是通過字節(jié)所處范圍來判斷。例如:在GBK編碼中,單字節(jié)字符的范圍是0x00-0x7F,雙字節(jié)字符首字節(jié)的范圍是0x81到0xFE。我們順序讀取字節(jié)數(shù)據(jù),如果讀到的字節(jié)在0x81到0xFE內(nèi),那么這個字節(jié)就是雙字節(jié)字符的首字節(jié)。GBK在字符編碼模型的第二層如下圖所示:圖1-3 GBK在字符編碼模型的第二層具體分體參見下圖:圖1-4 GBK的具體分區(qū)1.3.5 GB18030GB18030編碼向下兼容GB
19、K和GB2312,兼容的含義是不僅字符兼容,而且相同字符的編碼也相同。GB18030收錄了所有Unicode3.1中的字符,包括中國少數(shù)民族字符,GBK不支持的韓文字符等等,也可以說是世界大多民族的文字符號都被收錄在內(nèi)。 GB18030編碼是變長編碼,有單字節(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、集,它的字符可以用一個、兩個或四個字節(jié)表示。這時我們又如何判斷一個字節(jié)是屬于單字節(jié)字符,雙字節(jié)字符,還是四字節(jié)字符?GB18030與GBK是兼容的,它利用了GBK雙字節(jié)字符尾字節(jié)的未使用碼位。GB18030的四字節(jié)字符的第一字節(jié)的范圍也是0x81到0xFE,第二字節(jié)的范圍是0x30-0x39。通過第二字節(jié)所處范圍就可以區(qū)分雙字節(jié)字符和四字節(jié)字符。GB18030定義四字節(jié)字符的第三字節(jié)范圍是0x81到0xFE,第四字節(jié)范圍是0x30-0x39。1.3.6 BIG5BIG5 是通行于臺灣、香港地區(qū)的一個繁體字編碼方案。雖然存在一些瑕疵,但廣泛應(yīng)用于電腦行業(yè),尤其是互聯(lián)網(wǎng)中,從而成為一種事實上的行業(yè)
21、標準。BIG5 碼是雙字節(jié)編碼方案,其中第一個字節(jié)的值在 OXA1-OXF9 之間,第二個字節(jié)在 OX40-OX7E 和 OXA1-OXFE 之間,總計收入13868個字 (包括5401個常用字、7652 個次常用字、7個擴充字、以及808個各式符號),其中可以大致劃分為以下幾個字區(qū): 表1-1 BIG5字區(qū)與編碼范圍第一字節(jié)第二字節(jié)字區(qū)制定A1.A240.7E, A1.FE各種符號區(qū)1984A340.7E, A1.BF各種符號區(qū) (包括標點符號、ASCII 全角符號、注音符號等)1984A3E1歐元符號CP950A4.C540.7E, A1.FE常用字區(qū)1984C640.7E常用字
22、區(qū)1984C6A1.FE罕用符號區(qū)倚天C740.7E, A1.FE罕用符號區(qū) (包括日文、俄文等)倚天C840.7E, A1.D3罕用符號區(qū) (包括俄文、輸入法特殊符號等)倚天C9.F840.7E, A1.FE次常用字區(qū)1984F940.7E, A1.D5次常用字區(qū)1984F9D6.DC七個擴充字倚天F9DD.FE表格符號區(qū)倚天BIG5在字符編碼模型的第二層如下圖所示:圖1-5 BIG5在字符編碼模型的第二層具體分體參見下圖:圖1-6 BIG5的具體分區(qū)1.3.7 各種字符集總結(jié)字符集描述字節(jié)數(shù)別名ASCII英文字符1ANSIX3.4ISO-646ISO-8859-1西歐語系1Latin-1I
23、SO-8859-2中歐和東歐語系1Latin-2ISO-8859-3東南歐語系1 Latin-3ISO-8859-4北歐語系1Latin-4ISO-8859-5斯拉夫文1ISO-8859-6阿拉伯文1ISO-8859-7希臘文1ISO-8859-8希伯來文1ISO-8859-9土耳其文1Latin-5ISO-8859-10拉普人、北歐和愛斯基摩人的文字1Latin-6ISO-8859-11泰文1ISO-8859-13波羅的海語系1Latin-7ISO-8859-14凱爾特語系1Latin-8ISO-8859-15改進的Latin-11Latin-9ISO-8859-16羅馬尼亞文1Latin-
24、10GB2312中文簡體1-2GBK中文,兼容GB2312,增加了中文繁體,但與BIG不兼容1-2GB18030中文,兼容GBK1-2-4BIG5中文繁體1-2JOHAB韓語13SJIS日語1-21.4 Windows對于字符集的解決方法1.4.1 代碼頁代碼頁(Code Page)是個古老的專業(yè)術(shù)語,據(jù)說是IBM公司首先使用的。代碼頁和字符集的含義基本相同,代碼頁規(guī)定了適用于特定地區(qū)的字符集合,和這些字符的編碼??梢詫⒋a頁理解為字符和字節(jié)數(shù)據(jù)的映射表。Windows為自己支持的代碼頁都編了一個號碼。例如代碼頁936就是簡體中文 GBK,代碼頁950就是繁體中文 Big5。代碼頁的概念比較簡
25、單,就是一個字符編碼方案。但要說清楚Windows的ANSI代碼頁,就要從Windows的區(qū)域(Locale)說起了。 1.4.2 區(qū)域和ANSI代碼頁微軟為了適應(yīng)世界上不同地區(qū)用戶的文化背景和生活習(xí)慣,在Windows中設(shè)計了區(qū)域(Locale)設(shè)置的功能。Local是指特定于某個國家或地區(qū)的一組設(shè)定,包括代碼頁,數(shù)字、貨幣、時間和日期的格式等。在Windows內(nèi)部,其實有兩個Locale設(shè)置:系統(tǒng)Locale和用戶Locale。系統(tǒng)Locale決定代碼頁,用戶Locale決定數(shù)字、貨幣、時間和日期的格式。我們可以在控制面板的“區(qū)域和語言選項”中設(shè)置系統(tǒng)Locale和用戶Locale:每個L
26、ocale都有一個對應(yīng)的代碼頁。系統(tǒng)Locale對應(yīng)的代碼頁被作為Windows的默認代碼頁。在沒有文本編碼信息時,Windows按照默認代碼頁的編碼方案解釋文本數(shù)據(jù)。這個默認代碼頁通常被稱作ANSI代碼頁(ACP)。ANSI代碼頁還有一層意思,就是微軟自己定義的代碼頁。在歷史上,IBM的個人計算機和微軟公司的操作系統(tǒng)曾經(jīng)是PC的標準配置。微軟公司將IBM公司定義的代碼頁稱作OEM代碼頁,在IBM公司的代碼頁基礎(chǔ)上作了些增補后,作為自己的代碼頁,并冠以ANSI的字樣。我們在“區(qū)域和語言選項”高級頁面的代碼頁轉(zhuǎn)換表中看到的包含ANSI字樣的代碼頁都是微軟自己定義的代碼頁。例如:874 (ANSI
27、/OEM - 泰文) 932 (ANSI/OEM - 日文 Shift-JIS) 936 (ANSI/OEM - 簡體中文 GBK) 949 (ANSI/OEM - 韓文) 950 (ANSI/OEM - 繁體中文 Big5) 1250 (ANSI - 中歐) 1251 (ANSI - 西里爾文) 1252 (ANSI - 拉丁文 I) 1253 (ANSI - 希臘文) 1254 (ANSI - 土耳其文) 1255 (ANSI - 希伯來文) 1256 (ANSI - 阿拉伯文) 1257 (ANSI - 波羅的海文) 1258 (ANSI/OEM - 越南) 1.4.3 代碼頁轉(zhuǎn)換表在W
28、indows 2000以后,Windows統(tǒng)一采用UTF-16作為內(nèi)部字符編碼?,F(xiàn)在,安裝一個代碼頁就是安裝一張代碼頁轉(zhuǎn)換表。通過代碼頁轉(zhuǎn)換表,Windows既可以將代碼頁的編碼轉(zhuǎn)換到UTF-16,也可以將UTF-16轉(zhuǎn)換到代碼頁的編碼。代碼頁轉(zhuǎn)換表的具體實現(xiàn)可以是一個以nls為后綴的數(shù)據(jù)文件,也可以是一個提供轉(zhuǎn)換函數(shù)的動態(tài)鏈接庫。有的代碼頁是不需要安裝的。例如:Windows將UTF-7和UTF-8分別作為代碼頁65000和代碼頁65001。UTF-7、UTF-8和UTF-16都是基于Unicode的編碼方案。它們之間可以通過簡單的算法直接轉(zhuǎn)換,不需要安裝代碼頁轉(zhuǎn)換表。在安裝過一個代碼頁后,
29、Windows就知道怎樣將該代碼頁的文本轉(zhuǎn)換到Unicode文本,也知道怎樣將Unicode文本轉(zhuǎn)換成該代碼頁的文本。例如:UniToy有導(dǎo)入和導(dǎo)出功能。所謂導(dǎo)入功能就是將任一代碼頁的文本文件轉(zhuǎn)換到Unicode文本;導(dǎo)出功能就是將Unicode文本轉(zhuǎn)換到任一指定的代碼頁。這里所說的代碼頁就是指系統(tǒng)已安裝的代碼頁:其實,如果全世界人民在計算機剛發(fā)明時就統(tǒng)一采用Unicode作為字符編碼,那么代碼頁就沒有存在的必要了??上г赨nicode被發(fā)明前,世界各國人民都發(fā)明并使用了各種字符編碼方案。所以,Windows必須通過代碼頁支持已經(jīng)被廣泛使用的字符編碼。從這種意義看,代碼頁主要是為了兼容現(xiàn)有的數(shù)
30、據(jù)、程序和習(xí)慣而存在的。2 Unicode2.1 Unicode簡介2.1.1 問題的來由世界上存在著多種編碼方式,同一個二進制數(shù)字可以被解釋成不同的符號。因此,要想打開一個文本文件,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現(xiàn)亂碼。為什么電子郵件常常出現(xiàn)亂碼?就是因為發(fā)信人和收信人使用的編碼方式不一樣??梢韵胂?,如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那么亂碼問題就會消失。于是人們就開始了這種嘗試并最終得到了兩套標準:Unicode和UCS。2.1.2 UnicodeUnicode協(xié)會制定的編碼機制, 要將全世界常
31、用文字都函括進去。2.1.3 UCS國際標準化組織ISO制定的ISO10646標準所定義的 Universal Character Set(全稱 Universal Multiple-Octet Coded Character Set )。2.1.4 Unicode和UCS的關(guān)系國際標準化組織ISO與Unicode協(xié)會是兩個不同的組織, 因此最初制定了不同的標準; 但自從unicode2.0開始, unicode采用了與ISO 10646-1相同的字庫和字碼, ISO也承諾ISO10646將不會給超出0x10FFFF的UC
32、S-4編碼賦值, 使得兩者保持一致。2.2 Unicode的編碼和實現(xiàn)大概來說,Unicode 編碼系統(tǒng)可分為編碼方式和實現(xiàn)方式兩個層次。2.2.1 Unicode的編碼方式Unicode的編碼方式對應(yīng)于字符編碼模型的第二層。 UCS的編碼方式UCS共有兩種編碼方式標準:UCS-2和UCS-4。Ø UCS-2UCS-2用兩個字節(jié)編碼,共有216=65536個碼位Ø UCS-4UCS-4用4個字節(jié)(實際上只用了31位,最高位必須為0)編碼,共有231=2147483648個碼位。UCS-4根據(jù)最高位為0的最高字節(jié)分成27=128個group。每個group再根據(jù)
33、次高字節(jié)分為256個plane。每個plane根據(jù)第3個字節(jié)分為256行 (rows),每行包含256個cells。group 0的plane 0被稱作Basic Multilingual Plane, 即BMP?;蛘哒fUCS-4中,高兩個字節(jié)為0的碼位被稱作BMP。參見圖2-1。圖2-1 UCS-4中的group,plane,row,cell以及BMP將UCS-4的BMP去掉前面的兩個零字節(jié)就得到了UCS-2。在UCS-2的兩個字節(jié)前加上兩個零字節(jié),就得到了UCS-4的BMP。 Unicode的編碼方式目前實際應(yīng)用的 Unicode 編碼方式版本對應(yīng)于 UCS-2,使用16位的
34、編碼空間。也就是每個字符占用2個字節(jié)。這樣理論上一共最多可以表示 216 即 65536 個字符?;緷M足各種語言的使用。實際上目前版本的 Unicode 尚未填充滿這16位編碼,保留了大量空間作為特殊使用或?qū)頂U展。這種編碼方式構(gòu)成了BMP。最新(但未實際廣泛使用)的 Unicode編碼方式版本在BMP之外定義了16個輔助平面,兩者合起來至少需要占據(jù)21位的編碼空間,比3字節(jié)略少。但事實上輔助平面字符仍然占用4字節(jié)編碼空間,與 UCS-4 保持一致。未來版本會擴充到 ISO 10646-1 實現(xiàn)級別3,即涵蓋 UCS-4 的所有字符。2.3 Unicode的實現(xiàn)方式Unicode 的實現(xiàn)方式
35、不同于編碼方式。一個字符的 Unicode 編碼是確定的。但是在實際傳輸過程中,由于不同系統(tǒng)平臺的設(shè)計不一定一致,以及出于節(jié)省空間的目的,對 Unicode 編碼的實現(xiàn)方式有所不同。Unicode 的實現(xiàn)方式稱為UTF(Unicode Translation Format)。2.3.1 UTF- 編碼規(guī)則UTF-16編碼以16位無符號整數(shù)為單位。我們把Unicode編碼記作U。編碼規(guī)則如下:如果U<0x10000,U的UTF-16編碼就是U對應(yīng)的16位無符號整數(shù)(為書寫簡便,下文將16位無符號整數(shù)記作WORD)。 如果U0x10000,我們先計算U'=U-0x1
36、0000,然后將U'寫成二進制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16編碼(二進制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。 為什么U'可以被寫成20個二進制位?Unicode的最大碼位是0x10ffff,減去0x10000后,U'的最大值是0xfffff,所以肯定可以用20個二進制位表示。例如:“”字的Unicode編碼是0x20C30,減去0x10000后,得到0x10C30,寫成二進制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就
37、得到:1101100001000011 1101110000110000,即0xD843DC30。 代理區(qū)(Surrogate)按照上述規(guī)則,Unicode編碼0x10000-0x10FFFF的UTF-16編碼有兩個word,第一個word的高6位是110110,第二個WORD的高6位是110111??梢?,第一個WORD的取值范圍(二進制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二個WORD的取值范圍(二進制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。為
38、了將一個WORD的UTF-16編碼與兩個WORD的UTF-16編碼區(qū)分開來,Unicode編碼的設(shè)計者將0xD800-0xDFFF保留下來,并稱為代理區(qū)(Surrogate):D800DB7FHigh Surrogates高位替代DB80DBFFHigh Private Use Surrogates高位專用替代DC00DFFFLow Surrogates低位替代高位替代就是指這個范圍的碼位是兩個WORD的UTF-16編碼的第一個WORD。低位替代就是指這個范圍的碼位是兩個WORD的UTF-16編碼的第二個WORD。那么,高位專用替代是什么意思?我們來解答這個問題,順便看看怎么由UTF-16編碼
39、推導(dǎo)Unicode編碼。 解:如果一個字符的UTF-16編碼的第一個WORD在0xDB80到0xDBFF之間,那么它的Unicode編碼在什么范圍內(nèi)?我們知道第二個WORD的取值范圍是0xDC00-0xDFFF,所以這個字符的UTF-16編碼范圍應(yīng)該是0xDB80 0xDC00到0xDBFF 0xDFFF。我們將這個范圍寫成二進制: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編碼的第一個WORD在0xdb80到0xdbff之間的Unicode編碼范圍,即平面15和平面16。因為Unicode標準將平面15和平面16都作為專用區(qū),所以0xDB80到0xDBFF之間的保留碼位被稱作高位專用替代。2.3.2 UTF-32在UTF-32中,任意一個字符U所對應(yīng)的UTF-32編碼就是U對應(yīng)的32位無符號整數(shù)。2.3.3 UTF-8UTF-8以字節(jié)為編碼單位對Unicode進行編碼。從Unicode到UTF-
41、8的編碼方式如下:表2-2 UTF-8的編碼規(guī)則Unicode編碼(16進制)UTF-8 字節(jié)流(二進制)00000000 - 0000007F0xxxxxxx00000080 - 000007FF110xxxxx 10xxxxxx00000800 - 0000FFFF1110xxxx 10xxxxxx 10xxxxxx00010000 - 0010FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx00200000 - 03FFFFFF111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx04000000 - 7FFFFFFF111
42、1110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx對于當(dāng)前廣泛使用的Unicode編碼形式(UCS-2),每個字符對應(yīng)的UTF-8編碼最多需要用到3個字節(jié);對于最新的(還未廣泛使用)的Unicode編碼形式,每個字符對應(yīng)的UTF-8編碼最多需要用到4個字節(jié);而對于未來的完全支持UCS-4的Unicode編碼形式,每個字符對應(yīng)的UTF-8編碼最多需要用到6個字節(jié)。UTF-8的特點是對不同范圍的字符使用不同長度的編碼。對于0x00-0x7F之間的字符,UTF-8編碼與ASCII編碼完全相同。UTF-8有以下優(yōu)點:Ø 與CPU字節(jié)順序無關(guān),
43、 可以在不同平臺之間交流。Ø 容錯能力高, 任何一個字節(jié)損壞后, 最多只會導(dǎo)致一個編碼碼位損失, 不會鏈鎖錯誤(如GB碼錯一個字節(jié)就會整行亂碼) 。2.3.4 BOMUTF-8以字節(jié)為編碼單元,沒有字節(jié)序的問題。UTF-16以兩個字節(jié)為編碼單元,UTF-32以4個字節(jié)為編碼單元,在解釋一個UTF-16或UTF-32文本前,首先要弄清楚每個編碼單元的字節(jié)序。例如“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節(jié)流“594E”,那么這是“奎”還是“乙”?實際上此問題對應(yīng)于字符編碼模型的第四層。為了解決這個問題,Unicode規(guī)范引入了
44、BOM。BOM(byte-order mark),即字節(jié)順序標記,它是插入到以UTF-8、UTF16或UTF-32編碼Unicode文件開頭的特殊標記,用來識別Unicode文件的編碼類型。對于UTF-8來說,BOM并不是必須的,因為BOM用來標記多字節(jié)編碼文件的編碼類型和字節(jié)順序,而UTF-8以字節(jié)作為編碼單元;但可以用BOM來表明編碼方式。在Unicode編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在Unicode中是不存在的字符,所以不應(yīng)該出現(xiàn)在實際傳輸中。因而利用此字符作為BOM,下表列出了不同編碼所對
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ù)庫(Unicode Character Database)的縮寫。UCD由一些描述Unicode字符屬性和內(nèi)部關(guān)系的純文本或html文件組成。大家可以在Unicode組織的網(wǎng)站看到UCD的最新版本。 UCD
46、中的文本文件大都是適合于程序分析的Unicode相關(guān)數(shù)據(jù)。其中的html文件解釋了數(shù)據(jù)庫的組織,數(shù)據(jù)的格式和含義。UCD中最龐大的文件無疑就是描述漢字屬性的文件Unihan.txt。在UCD 5.0,0中,Unihan.txt文件大小有28,221K字節(jié)。Unihan.txt中包含了很多有參考價值的索引,例如漢字部首、筆劃、拼音、使用頻度、四角號碼排序等。這些索引都是基于一些比較權(quán)威的辭典,但大多數(shù)索引只能檢索部分漢字。我介紹UCD的目的主要是為了使用其中的兩個概念:Block和Script。 BlockUCD中的Blocks.txt將Unicode的碼位分割成一些連續(xù)的Bloc
47、k,并描述了每個Block的用途:開始碼位結(jié)束碼位Block名稱(英文)Block名稱(中文)0000007FBasic Latin基本拉丁字母008000FFLatin-1 Supplement拉丁字母補充-10100017FLatin Extended-A拉丁字母擴充-A0180024FLatin Extended-B拉丁字母擴充-B025002AFIPA Extensions國際音標擴充02B002FFSpacing Modifier Letters進格修飾字符0300036FCombining Diacritical Marks組合附加符號037003FFGreek and Copti
48、c希臘文和哥普特文040004FFCyrillic西里爾文0500052FCyrillic Supplement西里爾文補充0530058FArmenian亞美尼亞文059005FFHebrew希伯來文060006FFArabic基本阿拉伯文0700074FSyriac敘利亞文0750077FArabic Supplement阿拉伯文補充078007BFThaana塔納文07C007FFNKoN'Ko字母表0900097FDevanagari天成文書(梵文)098009FFBengali孟加拉文0A000A7FGurmukhi錫克教文0A800AFFGujarati古吉拉特文0B000
49、B7FOriya奧里亞文0B800BFFTamil泰米爾文0C000C7FTelugu泰盧固文0C800CFFKannada卡納達文0D000D7FMalayalam德拉維族文0D800DFFSinhala僧伽羅文0E000E7FThai泰文0E800EFFLao老撾文0F000FFFTibetan藏文1000109FMyanmar緬甸文10A010FFGeorgian格魯吉亞文110011FFHangul Jamo朝鮮文1200137FEthiopic埃塞俄比亞文1380139FEthiopic Supplement埃塞俄比亞文補充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拉丁字母音標擴充1D801DBFPhonetic Extensions Supplement拉丁字母音標擴充增補1DC01DFFCombining Diacritical Marks Supplement組合附加符號補充1E001EFFLatin Extended Additional拉丁字母擴充附加1F001FFFGreek Extended希臘文擴充2000206FGeneral Punctuation一般標點符號2070209FSuperscripts and Subscripts上標和下標20A020CFCurre
52、ncy Symbols貨幣符號20D020FFCombining Diacritical Marks for Symbols符號用組合附加符號2100214FLetterlike Symbols似字母符號2150218FNumber Forms數(shù)字形式219021FFArrows箭頭符號220022FFMathematical Operators數(shù)學(xué)運算符號230023FFMiscellaneous Technical零雜技術(shù)用符號2400243FControl Pictures控制圖符2440245FOptical Character Recognition光學(xué)字符識別246024FFEnc
53、losed Alphanumerics帶括號的字母數(shù)字2500257FBox Drawing制表符2580259FBlock Elements方塊元素25A025FFGeometric Shapes幾何形狀260026FFMiscellaneous Symbols零雜符號270027BFDingbats雜錦字型27C027EFMiscellaneous Mathematical Symbols-A零雜數(shù)學(xué)符號-A27F027FFSupplemental Arrows-A箭頭符號補充-A280028FFBraille Patterns盲文2900297FSupplemental Arrows-B
54、箭頭符號補充-B298029FFMiscellaneous Mathematical Symbols-B零雜數(shù)學(xué)符號-B2A002AFFSupplemental Mathematical Operators數(shù)學(xué)運算符號2B002BFFMiscellaneous Symbols and Arrows零雜符號和箭頭2C002C5FGlagolitic格拉哥里字母表2C602C7FLatin Extended-C拉丁字母擴充-C2C802CFFCoptic科普特文2D002D2FGeorgian Supplement格魯吉亞文補充2D302D7FTifinagh提非納字母2D802DDFEthiopic Extended埃塞俄比亞文擴充2E002E7FSupplemental Punctuation標點符號補充2E802EFFCJK Radicals Supplement中日韓部首補充2F002FDFKangxi Radicals康熙字典部首2FF02FFFIdeographic Description Characters漢字結(jié)構(gòu)描述字符3000303FCJK Symbols and Punctuation中日韓符號和標點 3040309FHiragana
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《制造業(yè)90后產(chǎn)線員工心理壓力、心理彈性與心理健康的關(guān)系》
- 2023年清遠市陽山縣碧桂園幼兒園招聘保育員筆試真題
- 2024年企業(yè)內(nèi)部控制與風(fēng)險管理咨詢合同3篇
- 12《寒冷的冬天》(教學(xué)實錄)一年級上冊科學(xué)冀教版
- 2024年水電項目咨詢合同3篇
- 臨床醫(yī)生帶教工作總結(jié)(10篇)
- 2024年物聯(lián)網(wǎng)智能家居設(shè)備采購與安裝合同
- 房產(chǎn)買賣意向協(xié)議書示例
- 集資房購買協(xié)議樣本
- 招標文件范本編輯指南
- 《登岳陽樓》課件+2023-2024學(xué)年統(tǒng)編版高中語文必修下冊
- 新進高校教師工作計劃
- 2024年人教版初一生物(上冊)期末試卷及答案(各版本)
- 中考英語688高頻詞大綱詞頻表
- 《馬克思主義發(fā)展史》題集
- 人教新目標版英語七下Unit 11《How was your school trip》(Section A 1a-1c)教學(xué)設(shè)計
- 大話機器人智慧樹知到期末考試答案章節(jié)答案2024年青海大學(xué)
- 含新能源發(fā)電接入的電力系統(tǒng)低頻振蕩阻尼控制研究綜述
- 2024年全國甲卷高考數(shù)學(xué)(理數(shù))真題試題(原卷版+含解析)
- 電大建筑材料(A)歷年試題和答案(精)請勿轉(zhuǎn)載
- 貴州省遵義市播州區(qū)2023-2024學(xué)年八年級上學(xué)期期末學(xué)業(yè)水平監(jiān)測數(shù)學(xué)試卷(含解析)
評論
0/150
提交評論