青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

淺談文字編碼和Unicode(下)(轉載)

Posted on 2011-05-12 21:58 RTY 閱讀(531) 評論(0)  編輯 收藏 引用 所屬分類: 編程常識轉載隨筆

3 字符編碼模型

程序員經常會面對復雜的問題,而降低復雜性的最簡單的方法就是分而治之。Peter Constable在他的文章"Character set encoding basics Understanding character set encodings and legacy encodings"中描述了字符編碼的四層模型。我覺得這種說法確實可以更清晰地展現字符編碼中發生的事情,所以在這里也介紹一下。

3.1 字符的范圍(Abstract character repertoire)

設計字符編碼的第一層就是確定字符的范圍,即要支持哪些字符。有些編碼方案的字符范圍是固定的,例如ASCII、ISO 8859 系列。有些編碼方案的字符范圍是開放的,例如Unicode的字符范圍就是世界上所有的字符。

3.2 用數字表示字符(Coded character set)

設計字符編碼的第二層是將字符和數字對應起來。可以將這個層次理解成數學家(即從數學角度)看到的字符編碼。數學家看到的字符編碼是一個正整數。例如在Unicode中:漢字“字”對應的數字是23383。漢字“”對應的數字是134192。

在寫html文件時,可以通過輸入"字"來插入字符“字”。不過在設計字符編碼時,我們還是習慣用16進制表示數字。即將23383寫成0x5BD7,將134192寫成0x20C30。

3.3 用基本數據類型表示字符(Character encoding form)

設計字符編碼的第三層是用編程語言中的基本數據類型來表示字符。可以將這個層次理解成程序員看到的字符編碼。在Unicode中,我們有很多方式將數字23383表示成程序中的數據,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的縮寫,可以翻譯成Unicode字符集轉換格式,即怎樣將Unicode定義的數字轉換成程序數據。例如,“漢字”對應的數字是0x6c49和0x5b57,而編碼的程序數據是:

 

	BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97};	// UTF-8編碼
	WORD data_utf16[] = {0x6c49, 0x5b57};				// UTF-16編碼
	DWORD data_utf32[] = {0x6c49, 0x5b57};				// UTF-32編碼

 

這里用BYTE、WORD、DWORD分別表示無符號8位整數,無符號16位整數和無符號32位整數。UTF-8、UTF-16、UTF-32分別以BYTE、WORD、DWORD作為編碼單位。

“漢字”的UTF-8編碼需要6個字節。“漢字”的UTF-16編碼需要兩個WORD,大小是4個字節。“漢字”的UTF-32編碼需要兩個DWORD,大小是8個字節。4.2節會介紹將數字映射到UTF編碼的規則。

3.4 作為字節流的字符(Character encoding scheme)

字符編碼的第四層是計算機看到的字符,即在文件或內存中的字節流。例如,“字”的UTF-32編碼是0x5b57,如果用little endian表示,字節流是“57 5b 00 00”。如果用big endian表示,字節流是“00 00 5b 57”。

字符編碼的第三層規定了一個字符由哪些編碼單位按什么順序表示。字符編碼的第四層在第三層的基礎上又考慮了編碼單位內部的字節序。UTF-8的編碼單位是字節,不受字節序的影響。UTF-16、UTF-32根據字節序的不同,又衍生出UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE四種編碼方案。LE和BE分別是Little Endian和Big Endian的縮寫。

3.5 小結

通過四層模型,我們又把字符編碼中發生的這些事情梳理了一遍。其實大多數代碼頁都不需要完整的四層模型,例如GB18030以字節為編碼單位,直接規定了字節序列和字符的映射關系,跳過了第二層,也不需要第四層。

4 再談Unicode

Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。Unicode用數字0-0x10FFFF來映射這些字符,最多可以容納1114112個字符,或者說有1114112個碼位。碼位就是可以分配給字符的數字。UTF-8、UTF-16、UTF-32都是將數字轉換到程序數據的編碼方案。

Unicode字符集可以簡寫為UCS(Unicode Character Set)。早期的Unicode標準有UCS-2、UCS-4的說法。UCS-2用兩個字節編碼,UCS-4用4個字節編碼。UCS-4根據最高位為0的最高字節分成2^7=128個group。每個group再根據次高字節分為256個平面(plane)。每個平面根據第3個字節分為256行 (row),每行有256個碼位(cell)。group 0的平面0被稱作BMP(Basic Multilingual Plane)。將UCS-4的BMP去掉前面的兩個零字節就得到了UCS-2。

Unicode標準計劃使用group 0 的17個平面: 從BMP(平面0)到平面16,即數字0-0x10FFFF。《談談Unicode編碼》主要介紹了BMP的編碼,本文將介紹完整的Unicode編碼,并從多個角度瀏覽Unicode。本文的介紹基于Unicode 5.0.0版本。

4.1 瀏覽Unicode

先看一些數字:每個平面有2^16=65536個碼位。Unicode計劃使用了17個平面,一共有17*65536=1114112個碼位。其實,現在已定義的碼位只有238605個,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定義了兩個各占65534個碼位的專用區(Private Use Area),分別是0xF0000-0xFFFFD和0x100000-0x10FFFD。所謂專用區,就是保留給大家放自定義字符的區域,可以簡寫為PUA。

平面0也有一個專用區:0xE000-0xF8FF,有6400個碼位。平面0的0xD800-0xDFFF,共2048個碼位,是一個被稱作代理區(Surrogate)的特殊區域。它的用途將在4.2節介紹。

238605-65534*2-6400-2408=99089。余下的99089個已定義碼位分布在平面0、平面1、平面2和平面14上,它們對應著Unicode目前定義的99089個字符,其中包括71226個漢字。平面0、平面1、平面2和平面14上分別定義了52080、3419、43253和337個字符。平面2的43253個字符都是漢字。平面0上定義了27973個漢字。

在更深入地了解Unicode字符前,我們先了解一下UCD。

4.1.1 什么是UCD

UCD是Unicode字符數據庫(Unicode Character Database)的縮寫。UCD由一些描述Unicode字符屬性和內部關系的純文本或html文件組成。大家可以在Unicode組織的網站看到UCD的最新版本

UCD中的文本文件大都是適合于程序分析的Unicode相關數據。其中的html文件解釋了數據庫的組織,數據的格式和含義。UCD中最龐大的文件無疑就是描述漢字屬性的文件Unihan.txt。在UCD 5.0,0中,Unihan.txt文件大小有28,221K字節。Unihan.txt中包含了很多有參考價值的索引,例如漢字部首、筆劃、拼音、使用頻度、四角號碼排序等。這些索引都是基于一些比較權威的辭典,但大多數索引只能檢索部分漢字。

我介紹UCD的目的主要是為了使用其中的兩個概念:Block和Script。

4.1.2 Block

UCD中的Blocks.txt將Unicode的碼位分割成一些連續的Block,并描述了每個Block的用途:

開始碼位結束碼位Block名稱(英文)Block名稱(中文)
0000007FBasic Latin基本拉丁字母
008000FFLatin-1 Supplement拉丁字母補充-1
0100017FLatin Extended-A拉丁字母擴充-A
0180024FLatin Extended-B拉丁字母擴充-B
025002AFIPA Extensions國際音標擴充
02B002FFSpacing Modifier Letters進格修飾字符
0300036FCombining Diacritical Marks組合附加符號
037003FFGreek and Coptic希臘文和哥普特文
040004FFCyrillic西里爾文
0500052FCyrillic Supplement西里爾文補充
0530058FArmenian亞美尼亞文
059005FFHebrew希伯來文
060006FFArabic基本阿拉伯文
0700074FSyriac敘利亞文
0750077FArabic Supplement阿拉伯文補充
078007BFThaana塔納文
07C007FFNKoN'Ko字母表
0900097FDevanagari天成文書(梵文)
098009FFBengali孟加拉文
0A000A7FGurmukhi錫克教文
0A800AFFGujarati古吉拉特文
0B000B7FOriya奧里亞文
0B800BFFTamil泰米爾文
0C000C7FTelugu泰盧固文
0C800CFFKannada卡納達文
0D000D7FMalayalam德拉維族文
0D800DFFSinhala僧伽羅文
0E000E7FThai泰文
0E800EFFLao老撾文
0F000FFFTibetan藏文
1000109FMyanmar緬甸文
10A010FFGeorgian格魯吉亞文
110011FFHangul Jamo朝鮮文
1200137FEthiopic埃塞俄比亞文
1380139FEthiopic Supplement埃塞俄比亞文補充
13A013FFCherokee切羅基文
1400167FUnified Canadian Aboriginal Syllabics加拿大印第安方言
1680169FOgham歐甘文
16A016FFRunic北歐古字
1700171FTagalog塔加路文
1720173FHanunoo哈努諾文
1740175FBuhid布迪文
1760177FTagbanwaTagbanwa文
178017FFKhmer高棉文
180018AFMongolian蒙古文
1900194FLimbu林布文
1950197FTai Le德宏傣文
198019DFNew Tai Lue新傣文
19E019FFKhmer Symbols高棉文
1A001A1FBuginese布吉文
1B001B7FBalinese巴厘文
1D001D7FPhonetic Extensions拉丁字母音標擴充
1D801DBFPhonetic Extensions Supplement拉丁字母音標擴充增補
1DC01DFFCombining Diacritical Marks Supplement組合附加符號補充
1E001EFFLatin Extended Additional拉丁字母擴充附加
1F001FFFGreek Extended希臘文擴充
2000206FGeneral Punctuation一般標點符號
2070209FSuperscripts and Subscripts上標和下標
20A020CFCurrency Symbols貨幣符號
20D020FFCombining Diacritical Marks for Symbols符號用組合附加符號
2100214FLetterlike Symbols似字母符號
2150218FNumber Forms數字形式
219021FFArrows箭頭符號
220022FFMathematical Operators數學運算符號
230023FFMiscellaneous Technical零雜技術用符號
2400243FControl Pictures控制圖符
2440245FOptical Character Recognition光學字符識別
246024FFEnclosed Alphanumerics帶括號的字母數字
2500257FBox Drawing制表符
2580259FBlock Elements方塊元素
25A025FFGeometric Shapes幾何形狀
260026FFMiscellaneous Symbols零雜符號
270027BFDingbats雜錦字型
27C027EFMiscellaneous Mathematical Symbols-A零雜數學符號-A
27F027FFSupplemental Arrows-A箭頭符號補充-A
280028FFBraille Patterns盲文
2900297FSupplemental Arrows-B箭頭符號補充-B
298029FFMiscellaneous Mathematical Symbols-B零雜數學符號-B
2A002AFFSupplemental Mathematical Operators數學運算符號
2B002BFFMiscellaneous Symbols and Arrows零雜符號和箭頭
2C002C5FGlagolitic格拉哥里字母表
2C602C7FLatin Extended-C拉丁字母擴充-C
2C802CFFCoptic科普特文
2D002D2FGeorgian Supplement格魯吉亞文補充
2D302D7FTifinagh提非納字母
2D802DDFEthiopic Extended埃塞俄比亞文擴充
2E002E7FSupplemental Punctuation標點符號補充
2E802EFFCJK Radicals Supplement中日韓部首補充
2F002FDFKangxi Radicals康熙字典部首
2FF02FFFIdeographic Description Characters漢字結構描述字符
3000303FCJK Symbols and Punctuation中日韓符號和標點
3040309FHiragana平假名
30A030FFKatakana片假名
3100312FBopomofo注音符號
3130318FHangul Compatibility Jamo朝鮮文兼容字母
3190319FKanbun日文的漢字批注
31A031BFBopomofo Extended注音符號擴充
31C031EFCJK Strokes中日韓筆劃
31F031FFKatakana Phonetic Extensions片假名音標擴充
320032FFEnclosed CJK Letters and Months帶括號的中日韓字母及月份
330033FFCJK Compatibility中日韓兼容字符
34004DBFCJK Unified Ideographs Extension A中日韓統一表意文字擴充A
4DC04DFFYijing Hexagram Symbols易經六十四卦象
4E009FFFCJK Unified Ideographs中日韓統一表意文字
A000A48FYi Syllables彝文音節
A490A4CFYi Radicals彝文字根
A700A71FModifier Tone Letters聲調修飾字母
A720A7FFLatin Extended-D拉丁字母擴充-D
A800A82FSyloti NagriSyloti Nagri字母表
A840A87FPhags-paPhags-pa字母表
AC00D7AFHangul Syllables朝鮮文音節
D800DB7FHigh Surrogates高位替代
DB80DBFFHigh Private Use Surrogates高位專用替代
DC00DFFFLow Surrogates低位替代
E000F8FFPrivate Use Area專用區
F900FAFFCJK Compatibility Ideographs中日韓兼容表意文字
FB00FB4FAlphabetic Presentation Forms字母變體顯現形式
FB50FDFFArabic Presentation Forms-A阿拉伯文變體顯現形式-A
FE00FE0FVariation Selectors字型變換選取器
FE10FE1FVertical Forms豎排標點符號
FE20FE2FCombining Half Marks組合半角標示
FE30FE4FCJK Compatibility Forms中日韓兼容形式
FE50FE6FSmall Form Variants小型變體形式
FE70FEFFArabic Presentation Forms-B阿拉伯文變體顯現形式-B
FF00FFEFHalfwidth and Fullwidth Forms半角及全角字符
FFF0FFFFSpecials特殊區域
100001007FLinear B Syllabary線形文字B音節文字
10080100FFLinear B Ideograms線形文字B表意文字
101001013FAegean Numbers愛琴海數字
101401018FAncient Greek Numbers古希臘數字
103001032FOld Italic古意大利文
103301034FGothic哥特文
103801039FUgaritic烏加里特楔形文字
103A0103DFOld Persian古波斯文
104001044FDeseret德塞雷特大學音標
104501047FShavian肅伯納速記符號
10480104AFOsmanyaOsmanya字母表
108001083FCypriot Syllabary塞浦路斯音節文字
109001091FPhoenician腓尼基文
10A0010A5FKharoshthi迦婁士悌文
12000123FFCuneiform楔形文字
124001247FCuneiform Numbers and Punctuation楔形文字數字和標點
1D0001D0FFByzantine Musical Symbols東正教音樂符號
1D1001D1FFMusical Symbols音樂符號
1D2001D24FAncient Greek Musical Notation古希臘音樂符號
1D3001D35FTai Xuan Jing Symbols太玄經符號
1D3601D37FCounting Rod Numerals算籌
1D4001D7FFMathematical Alphanumeric Symbols數學用字母數字符號
200002A6DFCJK Unified Ideographs Extension B中日韓統一表意文字擴充 B
2F8002FA1FCJK Compatibility Ideographs Supplement中日韓兼容表意文字補充
E0000E007FTags標簽
E0100E01EFVariation Selectors Supplement字型變換選取器補充
F0000FFFFFSupplementary Private Use Area-A補充專用區-A
10000010FFFFSupplementary Private Use Area-B補充專用區-B

Block是Unicode字符的一個屬性。屬于同一個Block的字符有著相近的用途。Block表中的開始碼位、結束碼位只是用來劃分出一塊區域,在開始碼位和結束碼位之間可能還有很多未定義的碼位。使用UniToy,大家可以按照Block瀏覽Unicode字符,既可以按列表顯示:

 

也可以顯示每個字符的詳細信息:

4.1.3 Script

Unicode中每個字符都有一個Script屬性,這個屬性表明字符所屬的文字系統。Unicode目前支持以下Script:

Script名稱(英文)Script名稱(中文)Script包含的字符數
Arabic阿拉伯文966
Armenian亞美尼亞文90
Balinese巴厘文121
Bengali孟加拉文91
Bopomofo漢語注音符號64
Braille盲文256
Buginese布吉文30
Buhid布迪文20
Canadian Aboriginal加拿大印第安方言630
Cherokee切羅基文85
CommonCommon5020
Coptic科普特文128
Cuneiform楔形文字982
Cypriot塞浦路斯音節文字55
Cyrillic西里爾文277
Deseret德塞雷特大學音標80
Devanagari天成文書(梵文)107
Ethiopic埃塞俄比亞文461
Georgian格魯吉亞文120
Gothic哥特文94
Glagolitic格拉哥里字母表27
Greek希臘文506
Gujarati古吉拉特文83
Gurmukhi錫克教文77
Han漢文71570
Hangul韓文書寫系統11619
Hanunoo哈努諾文21
Hebrew希伯來文133
Hiragana平假名89
InheritedInherited461
Kannada卡納達文86
Katakana片假名164
Kharoshthi迦婁士悌文65
Khmer高棉文146
Lao老撾文65
Latin拉丁文系1070
Limbu林布文(尼泊爾東部)66
Linear B線形文字B211
Malayalam德拉維族文(印度)78
Mongolian蒙古文152
Myanmar緬甸文78
New Tai Lue新傣文80
NkoN'Ko字母表59
Ogham歐甘文字29
Old Italic古意大利文35
Old Persian古波斯文50
Oriya奧里亞文81
OsmanyaOsmanya字母表40
Phags PaPhags Pa字母表(蒙古)56
Phoenician腓尼基文27
Runic古代北歐文78
Shavian肅伯納速記符號48
Sinhala僧伽羅文80
Syloti NagriSyloti Nagri字母表(印度)44
Syriac敘利亞文77
Tagalog塔加路文(菲律賓)20
TagbanwaTagbanwa文(菲律賓)18
Tai Le德宏傣文35
Tamil泰米爾文71
Telugu泰盧固文(印度)80
Thaana馬爾代夫書寫體50
Thai泰國文86
Tibetan藏文195
Tifinagh提非納字母表55
Ugaritic烏加里特楔形文字31
Yi彝文1220

其中,有兩個Script值有著特殊的含義:

  • Common:Script屬性為Common的字符可能在多個文字系統中使用,不是某個文字系統特有的。例如:空格、數字等。
  • Inherited:Script屬性為Inherited的字符會繼承前一個字符的Script屬性。主要是一些組合用符號,例如:在“組合附加符號”區(0x300-0x36f),字符的Script屬性都是Inherited。

UCD中的Script.txt列出了每個字符的Script屬性。使用UniToy可以按照Script屬性查看字符。例如:

左側Script窗口中,第一層節點是按英文字母順序排列的Script屬性。第二層節點是包含該Script文字的行(row),點擊后顯示該行內屬于這個Script的字符。這樣,就可以集中查看屬于同一文字系統的字符。

4.1.4 Unicode中的漢字

前面提過,在Unicode已定義的99089個字符中,有71226個字符是漢字。它們的分布如下:

Block名稱開始碼位結束碼位數量
中日韓統一表意文字擴充A34004db56582
中日韓統一表意文字4e009fbb20924
中日韓兼容表意文字f900fa2d302
中日韓兼容表意文字fa30fa6a59
中日韓兼容表意文字fa70fad9106
中日韓統一表意文字擴充B200002a6d642711
中日韓兼容表意文字補充2f8002fa1d542

UCD的Unihan.txt中的部首偏旁索引(kRSUnicode)可以檢索全部71226個漢字。kRSUnicode的部首是按照康熙字典定義的,共214個部首。簡體字按照簡體部首對應的繁體部首檢索。UniToy整理了康熙字典部首對應的簡體部首,提供了按照部首檢索漢字的功能:

4.2 UTF編碼

在字符編碼的四個層次中,第一層的范圍和第二層的編碼在4.1節已經詳細討論過了。本節討論第三層的UTF編碼和第四層的字節序,主要談談第三層的UTF編碼,即怎樣將Unicode定義的編碼轉換成程序數據。

4.2.1 UTF-8

UTF-8以字節為單位對Unicode進行編碼。從Unicode到UTF-8的編碼方式如下:

Unicode編碼(16進制)UTF-8 字節流(二進制)
000000 - 00007F0xxxxxxx
000080 - 0007FF110xxxxx 10xxxxxx
000800 - 00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8的特點是對不同范圍的字符使用不同長度的編碼。對于0x00-0x7F之間的字符,UTF-8編碼與ASCII編碼完全相同。UTF-8編碼的最大長度是4個字節。從上表可以看出,4字節模板有21個x,即可以容納21位二進制數字。Unicode的最大碼位0x10FFFF也只有21位。

例1:“漢”字的Unicode編碼是0x6C49。0x6C49在0x0800-0xFFFF之間,使用用3字節模板了:1110xxxx 10xxxxxx 10xxxxxx。將0x6C49寫成二進制是:0110 1100 0100 1001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

例2:“”字的Unicode編碼是0x20C30。0x20C30在0x010000-0x10FFFF之間,使用用4字節模板了:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。將0x20C30寫成21位二進制數字(不足21位就在前面補0):0 0010 0000 1100 0011 0000,用這個比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。

4.2.2 UTF-16

UniToy有個“輸出編碼”功能,可以輸出當前選擇的文本編碼。因為UniToy內部采用UTF-16編碼,所以輸出的編碼就是文本的UTF-16編碼。例如:如果我們輸出“漢”字的UTF-16編碼,可以看到0x6C49,這與“漢”字的Unicode編碼是一致的。如果我們輸出“”字的UTF-16編碼,可以看到0xD843, 0xDC30。“”字的Unicode編碼是0x20C30,它的UTF-16編碼是怎樣得到的呢?

4.2.2.1 編碼規則

UTF-16編碼以16位無符號整數為單位。我們把Unicode編碼記作U。編碼規則如下:

  • 如果U<0x10000,U的UTF-16編碼就是U對應的16位無符號整數(為書寫簡便,下文將16位無符號整數記作WORD)。
  • 如果U≥0x10000,我們先計算U'=U-0x10000,然后將U'寫成二進制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16編碼(二進制)就是:110110yyyyyyyyyy110111xxxxxxxxxx。

為什么U'可以被寫成20個二進制位?Unicode的最大碼位是0x10ffff,減去0x10000后,U'的最大值是0xfffff,所以肯定可以用20個二進制位表示。例如:“”字的Unicode編碼是0x20C30,減去0x10000后,得到0x10C30,寫成二進制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。

4.2.2.2 代理區(Surrogate)

按照上述規則,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。

為了將一個WORD的UTF-16編碼與兩個WORD的UTF-16編碼區分開來,Unicode編碼的設計者將0xD800-0xDFFF保留下來,并稱為代理區(Surrogate):

D800DB7FHigh Surrogates高位替代
DB80DBFFHigh Private Use Surrogates高位專用替代
DC00DFFFLow Surrogates低位替代

高位替代就是指這個范圍的碼位是兩個WORD的UTF-16編碼的第一個WORD。低位替代就是指這個范圍的碼位是兩個WORD的UTF-16編碼的第二個WORD。那么,高位專用替代是什么意思?我們來解答這個問題,順便看看怎么由UTF-16編碼推導Unicode編碼。

解:如果一個字符的UTF-16編碼的第一個WORD在0xDB80到0xDBFF之間,那么它的Unicode編碼在什么范圍內?我們知道第二個WORD的取值范圍是0xDC00-0xDFFF,所以這個字符的UTF-16編碼范圍應該是0xDB80 0xDC00到0xDBFF 0xDFFF。我們將這個范圍寫成二進制:

1101101110000000 11011100 00000000 - 1101101111111111 1101111111111111

按照編碼的相反步驟,取出高低WORD的后10位,并拼在一起,得到

1110 0000 0000 0000 0000 - 1111 1111 1111 1111 1111

即0xe0000-0xfffff,按照編碼的相反步驟再加上0x10000,得到0xf0000-0x10ffff。這就是UTF-16編碼的第一個WORD在0xdb80到0xdbff之間的Unicode編碼范圍,即平面15和平面16。因為Unicode標準將平面15和平面16都作為專用區,所以0xDB80到0xDBFF之間的保留碼位被稱作高位專用替代。

4.2.3 UTF-32

UTF-32編碼以32位無符號整數為單位。Unicode的UTF-32編碼就是其對應的32位無符號整數。

4.2.4 字節序

根據字節序的不同,UTF-16可以被實現為UTF-16LE或UTF-16BE,UTF-32可以被實現為UTF-32LE或UTF-32BE。例如:

字符Unicode編碼UTF-16LEUTF-16BEUTF32-LEUTF32-BE
0x6C4949 6C6C 4949 6C 00 0000 00 6C 49
0x20C3043 D8 30 DCD8 43 DC 3030 0C 02 0000 02 0C 30

 

那么,怎么判斷字節流的字節序呢?

 

Unicode標準建議用BOM(Byte Order Mark)來區分字節序,即在傳輸字節流前,先傳輸被作為BOM的字符"零寬無中斷空格"。這個字符的編碼是FEFF,而反過來的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定義的碼位,不應該出現在實際傳輸中。下表是各種UTF編碼的BOM:

UTF編碼Byte Order Mark
UTF-8EF BB BF
UTF-16LEFF FE
UTF-16BEFE FF
UTF-32LEFF FE 00 00
UTF-32BE00 00 FE FF

5 結束語

程序員的工作就是將復雜的世界簡單地表達出來,希望這篇文章也能做到這一點。本文的初稿完成于2007年2月14日。我會在我的個人主頁http://www.fmddlmyy.cn維護這篇文章的最新版本。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品一区二区三区四区五区| 亚洲精品在线观看免费| 亚洲一区二区三区高清 | 欧美在线免费| 夜夜嗨av一区二区三区四季av| 久久久99精品免费观看不卡| 国产欧美精品xxxx另类| 亚洲无玛一区| 日韩视频在线免费| 一区二区三区久久网| 欧美黄色大片网站| 亚洲精品视频啊美女在线直播| 亚洲片区在线| 日韩视频三区| 亚洲欧美日韩另类| 国产精品国产a级| 一区二区三区视频在线| 一区二区三区久久久| 亚洲精品乱码久久久久久日本蜜臀| 一本色道综合亚洲| 久久久国产一区二区三区| 美女主播一区| 国产精品免费福利| 亚洲东热激情| 欧美高清hd18日本| 欧美成人免费一级人片100| 亚洲精品久久7777| 日韩亚洲欧美一区| 国产日韩欧美一区二区三区四区| 亚洲免费人成在线视频观看| 免费观看久久久4p| 亚洲视频一区二区| 国产亚洲成人一区| 亚洲视频在线观看三级| 欧美日韩精品在线观看| 国产精品一区免费观看| 久久精品91久久香蕉加勒比 | 久久精品系列| 亚洲欧洲一区二区在线播放| 亚洲国产精品久久久久婷婷884 | 亚洲福利视频网| 午夜国产精品影院在线观看| 国语自产在线不卡| 91久久久亚洲精品| 国产精品久久久爽爽爽麻豆色哟哟| 香蕉视频成人在线观看| 久久九九精品| aa亚洲婷婷| 久久精品女人| 亚洲亚洲精品三区日韩精品在线视频 | 免费在线观看精品| aa级大片欧美三级| 久久av免费一区| 亚洲精品自在在线观看| 亚洲欧美日韩另类| 亚洲免费电影在线| 欧美激情一区二区三区成人 | 亚洲欧美久久| 久久久www成人免费精品| 国产欧美日韩精品a在线观看| 在线一区欧美| 99精品免费网| 国产情人综合久久777777| 国产日韩一区二区三区在线播放| 免费成人黄色| 久久久亚洲国产天美传媒修理工 | 午夜免费电影一区在线观看| 久久亚洲视频| 香港久久久电影| 亚洲一区二区精品| 欧美激情中文字幕一区二区 | 久久国产精品99精品国产| 亚洲一区二区三区在线播放| 欧美另类69精品久久久久9999| 精品电影在线观看| 亚洲日本国产| 欧美国产日韩a欧美在线观看| 亚洲一区二区四区| 国产精品实拍| 国产精品成人久久久久| 乱码第一页成人| 久久久久久色| 亚洲一区在线直播| 欧美激情精品久久久久久大尺度 | 亚洲美女精品久久| 久久久精品视频成人| 久久九九免费视频| 久久久久国产精品厨房| 久久动漫亚洲| 国产午夜精品久久久久久久| 欧美1区3d| 狠狠综合久久| 久久久91精品国产一区二区三区| 亚洲国产高清视频| 久久精品成人| 亚洲精品资源| 欧美精品激情在线观看| 亚洲日本欧美| 亚洲一区精品电影| 国产精品理论片| 亚洲欧美日韩久久精品| 亚洲国产成人精品久久| 久久久久国产精品麻豆ai换脸| 亚洲精品欧洲精品| 欧美成在线观看| 亚洲日韩成人| 红桃视频一区| 久久躁狠狠躁夜夜爽| 午夜在线观看免费一区| 国产精品丝袜xxxxxxx| 亚洲欧美精品伊人久久| 久久精品99| 亚洲国产婷婷香蕉久久久久久| 欧美激情一区二区三区在线视频观看 | 欧美午夜一区| 亚洲午夜久久久久久尤物| 亚洲日产国产精品| 国产精品久久久久久久久久直播| 欧美电影电视剧在线观看| 久久久激情视频| 久久香蕉精品| 久久夜色撩人精品| 1769国内精品视频在线播放| 国产欧美一区二区色老头| 久久国产精品第一页| 欧美激情精品| 欧美日韩国产综合一区二区| 亚洲国产清纯| 香蕉av777xxx色综合一区| 欧美~级网站不卡| a4yy欧美一区二区三区| 久久久久天天天天| 亚洲精品一区二区在线| 欧美视频中文字幕在线| 亚洲国产二区| 国产欧美日韩精品丝袜高跟鞋| 久久人人97超碰精品888| 日韩视频在线免费观看| 久久综合伊人| 在线播放中文一区| 欧美日韩久久不卡| 久久久一区二区三区| 久久在线精品| 国产一区二区三区奇米久涩| 欧美a级大片| 欧美影院在线播放| 久久久久国产一区二区三区| 日韩视频免费观看高清完整版| 国产欧美在线观看| 欧美日韩在线一区二区| 久久久久国产一区二区三区四区| 欧美一级欧美一级在线播放| 最新国产成人av网站网址麻豆| 男女av一区三区二区色多| 亚洲一区二区三区四区五区黄| 亚洲欧美怡红院| 国产日韩欧美综合精品| 欧美在线视频日韩| 亚洲无毛电影| 9l视频自拍蝌蚪9l视频成人 | 亚洲一级特黄| 亚洲精品日本| 香港久久久电影| 中国成人黄色视屏| 国产欧美日韩激情| 国产精品国产三级国产普通话99| 亚洲综合日韩在线| 久久女同精品一区二区| 亚洲高清精品中出| 欧美日韩国产区| 欧美韩国日本综合| 欧美第一黄色网| 狠狠做深爱婷婷久久综合一区| 99视频精品| 日韩视频永久免费观看| 欧美福利视频在线观看| 久久国产主播精品| 欧美激情精品久久久久久黑人| 亚洲美女免费视频| 一区二区三区在线观看国产| 免费在线日韩av| 久久亚洲欧美| 日韩午夜一区| 亚洲美女黄色片| 久久久国产成人精品| 久久九九国产精品| 久久九九99| 欧美成人精品在线| 亚洲国产欧美在线| 久久国产精品一区二区| 欧美在线日韩| 免费观看一区| 亚洲精品乱码| 亚洲嫩草精品久久| 亚洲精品男同| 欧美成人综合一区| 久久精品中文字幕一区| 亚洲一区二区三区高清不卡| 欧美在线观看www| 欧美成人午夜激情|