unicode统一编码Word格式.docx
《unicode统一编码Word格式.docx》由会员分享,可在线阅读,更多相关《unicode统一编码Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
每个平面根据第3个字节分为256行(row),每行有256个码位(cell)。
group0的平面0被称作BMP(BasicMultilingualPlane)。
将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。
每个平面有2^16=65536个码位。
Unicode计划使用了17个平面,一共有17*65536=1114112个码位。
在Unicode5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。
其中平面15和平面16上只是定义了两个各占65534个码位的专用区(PrivateUseArea),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。
所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。
平面0也有一个专用区:
0xE000-0xF8FF,有6400个码位。
平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。
代理区的目的用两个UTF-16字符表示BMP以外的字符。
在介绍UTF-16编码时会介绍。
如前所述在Unicode5.0.0版本中,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个汉字。
2.2实现方式
在Unicode中:
汉字“字”对应的数字是23383。
在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:
UTF-8、UTF-16、UTF-32。
UTF是“UCSTransformationFormat”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。
例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
BYTEdata_utf8[]={0xE6,0xB1,0x89,0xE5,0xAD,0x97};
//UTF-8编码
WORDdata_utf16[]={0x6c49,0x5b57};
//UTF-16编码
DWORDdata_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个字节。
根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。
下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。
2.3UTF-8
UTF-8以字节为单位对Unicode进行编码。
从Unicode到UTF-8的编码方式如下:
Unicode编码(16进制) ║ UTF-8字节流(二进制)
000000-00007F ║ 0xxxxxxx
000080-0007FF ║ 110xxxxx10xxxxxx
000800-00FFFF ║ 1110xxxx10xxxxxx10xxxxxx
010000-10FFFF ║ 11110xxx10xxxxxx10xxxxxx10xxxxxx
UTF-8的特点是对不同范围的字符使用不同长度的编码。
对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。
UTF-8编码的最大长度是4个字节。
从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。
Unicode的最大码位0x10FFFF也只有21位。
例1:
“汉”字的Unicode编码是0x6C49。
0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:
1110xxxx10xxxxxx10xxxxxx。
将0x6C49写成二进制是:
0110110001001001,用这个比特流依次代替模板中的x,得到:
111001101011000110001001,即E6B189。
例2:
Unicode编码0x20C30在0x010000-0x10FFFF之间,使用用4字节模板了:
11110xxx10xxxxxx10xxxxxx10xxxxxx。
将0x20C30写成21位二进制数字(不足21位就在前面补0):
000100000110000110000,用这个比特流依次代替模板中的x,得到:
11110000101000001011000010110000,即F0A0B0B0。
2.4UTF-16
UTF-16编码以16位无符号整数为单位。
我们把Unicode编码记作U。
编码规则如下:
如果U<
0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。
如果U≥0x10000,我们先计算U'
=U-0x10000,然后将U'
写成二进制形式:
yyyyyyyyyyxxxxxxxxxx,U的UTF-16编码(二进制)就是:
110110yyyyyyyyyy110111xxxxxxxxxx。
为什么U'
可以被写成20个二进制位?
Unicode的最大码位是0x10ffff,减去0x10000后,U'
的最大值是0xfffff,所以肯定可以用20个二进制位表示。
例如:
Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:
00010000110000110000。
用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:
11011000010000111101110000110000,即0xD8430xDC30。
按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第一个WORD的高6位是110110,第二个WORD的高6位是110111。
可见,第一个WORD的取值范围(二进制)是1101100000000000到1101101111111111,即0xD800-0xDBFF。
第二个WORD的取值范围(二进制)是1101110000000000到1101111111111111,即0xDC00-0xDFFF。
为了将一个WORD的UTF-16编码与两个WORD的UTF-16编码区分开来,Unicode编码的设计者将0xD800-0xDFFF保留下来,并称为代理区(Surrogate):
D800-DB7F ║ HighSurrogates ║ 高位替代
DB80-DBFF ║ HighPrivateUseSurrogates ║ 高位专用替代
DC00-DFFF ║ LowSurrogates ║ 低位替代
高位替代就是指这个范围的码位是两个WORD的UTF-16编码的第一个WORD。
低位替代就是指这个范围的码位是两个WORD的UTF-16编码的第二个WORD。
那么,高位专用替代是什么意思?
我们来解答这个问题,顺便看看怎么由UTF-16编码推导Unicode编码。
如果一个字符的UTF-16编码的第一个WORD在0xDB80到0xDBFF之间,那么它的Unicode编码在什么范围内?
我们知道第二个WORD的取值范围是0xDC00-0xDFFF,所以这个字符的UTF-16编码范围应该是0xDB800xDC00到0xDBFF0xDFFF。
我们将这个范围写成二进制:
11011011100000001101110000000000-11011011111111111101111111111111
按照编码的相反步骤,取出高低WORD的后10位,并拼在一起,得到
11100000000000000000-11111111111111111111
即0xe0000-0xfffff,按照编码的相反步骤再加上0x10000,得到0xf0000-0x10ffff。
这就是UTF-16编码的第一个WORD在0xdb80到0xdbff之间的Unicode编码范围,即平面15和平面16。
因为Unicode标准将平面15和平面16都作为专用区,所以0xDB80到0xDBFF之间的保留码位被称作高位专用替代。
2.5UTF-32
UTF-32编码以32位无符号整数为单位。
Unicode的UTF-32编码就是其对应的32位无符号整数。
字节序
根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。
Unicode编码 ║ UTF-16LE ║ UTF-16BE ║ UTF32-LE ║ UTF32-BE
0x006C49 ║ 496C ║ 6C49 ║ 496C0000 ║ 00006C49
0x020C30 ║ 43D830DC ║ D843DC30 ║ 300C0200 ║ 00020C30
那么,怎么判断字节流的字节序呢?
Unicode标准建议用BOM(ByteOrderMark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符"
零宽无中断空格"
。
这个字符的编码是FEFF,而反过来的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,不应该出现在实际传输中。
下表是各种UTF编码的BOM:
UTF编码 ║ ByteOrderMark
UTF-8 ║ EFBBBF
UTF-16LE ║ FFFE
UTF-16BE ║ FEFF
UTF-32LE ║ FFFE0000
UTF-32BE ║ 0000FEFF
UCS-2编码范围
Unicode到目前为止所定义的五个平面中,第0平面(BMP)最为重要.其编码分布如下.
注:
中文范围4E00-9FBF:
CJK统一表意符号(CJKUnifiedIdeographs)
0000-007F:
C0控制符及基本拉丁文(C0ControlandBasicLatin)
0080-00FF:
C1控制符及拉丁文补充-1(C1ControlandLatin1Supplement)
0100-017F:
拉丁文扩展-A(LatinExtended-A)
0180-024F:
拉丁文扩展-B(LatinExtended-B)
0250-02AF:
国际音标扩展(IPAExtensions)
02B0-02FF:
空白修饰字母(SpacingModifiers)
0300-036F:
结合用读音符号(CombiningDiacriticsMarks)
0370-03FF:
希腊文及科普特文(GreekandCoptic)
0400-04FF:
西里尔字母(Cyrillic)
0500-052F:
西里尔字母补充(CyrillicSupplement)
0530-058F:
亚美尼亚语(Armenian)
0590-05FF:
希伯来文(Hebrew)
0600-06FF:
阿拉伯文(Arabic)
0700-074F:
叙利亚文(Syriac)
0750-077F:
阿拉伯文补充(ArabicSupplement)
0780-07BF:
马尔代夫语(Thaana)
07C0-077F:
西非书面语言(N'
Ko)
0800-085F:
阿维斯塔语及巴列维语(AvestanandPahlavi)
0860-087F:
Mandaic
0880-08AF:
撒马利亚语(Samaritan)
0900-097F:
天城文书(Devanagari)
0980-09FF:
孟加拉语(Bengali)
0A00-0A7F:
锡克教文(Gurmukhi)
0A80-0AFF:
古吉拉特文(Gujarati)
0B00-0B7F:
奥里亚文(Oriya)
0B80-0BFF:
泰米尔文(Tamil)
0C00-0C7F:
泰卢固文(Telugu)
0C80-0CFF:
卡纳达文(Kannada)
0D00-0D7F:
德拉维族语(Malayalam)
0D80-0DFF:
僧伽罗语(Sinhala)
0E00-0E7F:
泰文(Thai)
0E80-0EFF:
老挝文(Lao)
0F00-0FFF:
藏文(Tibetan)
1000-109F:
缅甸语(Myanmar)
10A0-10FF:
格鲁吉亚语(Georgian)
1100-11FF:
朝鲜文(HangulJamo)
1200-137F:
埃塞俄比亚语(Ethiopic)
1380-139F:
埃塞俄比亚语补充(EthiopicSupplement)
13A0-13FF:
切罗基语(Cherokee)
1400-167F:
统一加拿大土著语音节(UnifiedCanadianAboriginalSyllabics)
1680-169F:
欧甘字母(Ogham)
16A0-16FF:
如尼文(Runic)
1700-171F:
塔加拉语(Tagalog)
1720-173F:
Hanunó
o
1740-175F:
Buhid
1760-177F:
Tagbanwa
1780-17FF:
高棉语(Khmer)
1800-18AF:
蒙古文(Mongolian)
18B0-18FF:
Cham
1900-194F:
Limbu
1950-197F:
德宏泰语(TaiLe)
1980-19DF:
新傣仂语(NewTaiLue)
19E0-19FF:
高棉语记号(KmerSymbols)
1A00-1A1F:
Buginese
1A20-1A5F:
Batak
1A80-1AEF:
Lanna
1B00-1B7F:
巴厘语(Balinese)
1B80-1BB0:
巽他语(Sundanese)
1BC0-1BFF:
PahawhHmong
1C00-1C4F:
雷布查语(Lepcha)
1C50-1C7F:
OlChiki
1C80-1CDF:
曼尼普尔语(Meithei/Manipuri)
1D00-1D7F:
语音学扩展(PhoneticExtensions)
1D80-1DBF:
语音学扩展补充(PhoneticExtensionsSupplement)
1DC0-1DFF:
结合用读音符号补充(CombiningDiacriticsMarksSupplement)
1E00-1EFF:
拉丁文扩充附加(LatinExtendedAdditional)
1F00-1FFF:
希腊语扩充(GreekExtended)
2000-206F:
常用标点(GeneralPunctuation)
2070-209F:
上标及下标(SuperscriptsandSubscripts)
20A0-20CF:
货币符号(CurrencySymbols)
20D0-20FF:
组合用记号(CombiningDiacriticsMarksforSymbols)
2100-214F:
字母式符号(LetterlikeSymbols)
2150-218F:
数字形式(NumberForm)
2190-21FF:
箭头(Arrows)
2200-22FF:
数学运算符(MathematicalOperator)
2300-23FF:
杂项工业符号(MiscellaneousTechnical)
2400-243F:
控制图片(ControlPictures)
2440-245F:
光学识别符(OpticalCharacterRecognition)
2460-24FF:
封闭式字母数字(EnclosedAlphanumerics)
2500-257F:
制表符(BoxDrawing)
2580-259F:
方块元素(BlockElement)
25A0-25FF:
几何图形(GeometricShapes)
2600-26FF:
杂项符号(MiscellaneousSymbols)
2700-27BF:
印刷符号(Dingbats)
27C0-27EF:
杂项数学符号-A(MiscellaneousMathematicalSymbols-A)
27F0-27FF:
追加箭头-A(SupplementalArrows-A)
2800-28FF:
盲文点字模型(BraillePatterns)
2900-297F:
追加箭头-B(SupplementalArrows-B)
2980-29FF:
杂项数学符号-B(MiscellaneousMathematicalSymbols-B)
2A00-2AFF:
追加数学运算符(SupplementalMathematicalOperator)
2B00-2BFF:
杂项符号和箭头(MiscellaneousSymbolsandArrows)
2C00-2C5F:
格拉哥里字母(Glagolitic)
2C60-2C7F:
拉丁文扩展-C(LatinExtended-C)
2C80-2CFF:
古埃及语(Coptic)
2D00-2D2F:
格鲁吉亚语补充(GeorgianSupplement)
2D30-2D7F:
提非纳文(Tifinagh)
2D80-2DDF:
埃塞俄比亚语扩展(EthiopicExtended)
2E00-2E7F:
追加标点(SupplementalPunctuation)
2E80-2EFF:
CJK部首补充(CJKRadicalsSupplement)
2F00-2FDF:
康熙字典部首(KangxiRadicals)
2FF0-2FFF:
表意文字描述符(IdeographicDescriptionCharacters)
3000-303F:
CJK符号和标点(CJKSymbolsandPunctuation)
3040-309F:
日文平假名(Hiragana)
30A0-30FF:
日文片假名(Katakana)
3100-312F:
注音字母(Bopomofo)
3130-318F:
朝鲜文兼容字母(HangulCompatibilityJamo)
3190-319F:
象形字注释标志(Kanbun)
31A0-31BF:
注音字母扩展(BopomofoExtended)
31C0-31EF:
CJK笔画(CJKStrokes)
31F0-31FF:
日文片假名语音扩展(KatakanaPhonetic