1、每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0的平面0被称作BMP(Basic Multilingual Plane)。将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。每个平面有216=65536个码位。Unicode计划使用了17个平面,一共有17*65536=1114112个码位。在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-
2、0xFFFFD和0x100000-0x10FFFD。所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。平面0也有一个专用区:0xE000-0xF8FF,有6400个码位。平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。代理区的目的用两个UTF-16字符表示BMP以外的字符。在介绍UTF-16编码时会介绍。如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2408=99089。余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,它们对应着Unicode目前定义的99089个
3、字符,其中包括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是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数
4、据是: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个字节。“汉
5、字”的UTF-32编码需要两个DWORD,大小是8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。2.3 UTF-8 UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:Unicode编码(16进制)UTF-8 字节流(二进制) 000000 - 00007F0xxxxxxx 000080 - 0007FF110xxxxx 10xxxxxx 000800 - 00FFFF1110xxxx 10x
6、xxxxx 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
7、写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。例2:Unicode编码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。2.4
8、 UTF-16 UTF-16编码以16位无符号整数为单位。我们把Unicode 编码记作U。编码规则如下:如果U0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。如果U0x10000,我们先计算U=U-0x10000,然后将U写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。为什么U可以被写成20个二进制位?Unicode的最大码位是0x10ffff,减去0x10000后,U的最大值是0xfffff,所以肯定可
9、以用20个二进制位表示。例如:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第一个WORD的高6位是110110,第二个WORD的高6位是110111。可见,第一个WORD的取值范围(二进制)是11011000 00000000到110110
10、11 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低位替代 高位替代就是指这个范围的码位是两个W
11、ORD的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 -
12、 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之间的保留码位被称作高位专用替代。2.5 U
13、TF-32 UTF-32编码以32位无符号整数为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。字节序 根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。Unicode编码UTF-16LEUTF-16BEUTF32-LEUTF32-BE 0x006C4949 6C6C 4949 6C 00 0000 00 6C 49 0x020C3043 D8 30 DCD8 43 DC 3030 0C 02 0000 02 0C 30 那么,怎么判断字节流的字节序呢?Unicode标准建议用BOM(B
14、yte 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 UCS-2 编码范围Unicode 到目前为止所定义的五个平面中,第0平面(BMP)最为重要. 其编码分布如
15、下. 注:中文范围 4E00-9FBF:CJK 统一表意符号 (CJK Unified Ideographs) 0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic Latin) 0080-00FF:C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement) 0100-017F:拉丁文扩展-A (Latin Extended-A) 0180-024F:拉丁文扩展-B (Latin Extended-B) 0250-02AF:国际音标扩展 (IPA Extensions) 02B0-02FF:空白修饰字母 (Spacing
16、 Modifiers) 0300-036F:结合用读音符号 (Combining Diacritics Marks) 0370-03FF:希腊文及科普特文 (Greek and Coptic) 0400-04FF:西里尔字母 (Cyrillic) 0500-052F:西里尔字母补充 (Cyrillic Supplement) 0530-058F:亚美尼亚语 (Armenian) 0590-05FF:希伯来文 (Hebrew) 0600-06FF:阿拉伯文 (Arabic) 0700-074F:叙利亚文 (Syriac) 0750-077F:阿拉伯文补充 (Arabic Supplement)
17、0780-07BF:马尔代夫语 (Thaana) 07C0-077F:西非书面语言 (NKo) 0800-085F:阿维斯塔语及巴列维语 (Avestan and Pahlavi) 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:泰
18、卢固文 (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:朝鲜文 (Hangul Jamo) 1200-137F:埃塞俄比亚语 (Ethiopic) 1380-139F:埃塞俄比亚语补充 (Ethiopic Supplement
19、) 13A0-13FF:切罗基语 (Cherokee) 1400-167F:统一加拿大土著语音节 (Unified Canadian Aboriginal Syllabics) 1680-169F:欧甘字母 (Ogham) 16A0-16FF:如尼文 (Runic) 1700-171F:塔加拉语 (Tagalog) 1720-173F:Hanuno 1740-175F:Buhid 1760-177F:Tagbanwa 1780-17FF:高棉语 (Khmer) 1800-18AF:蒙古文 (Mongolian) 18B0-18FF:Cham 1900-194F:Limbu 1950-197F:
20、德宏泰语 (Tai Le) 1980-19DF:新傣仂语 (New Tai Lue) 19E0-19FF:高棉语记号 (Kmer Symbols) 1A00-1A1F:Buginese 1A20-1A5F:Batak 1A80-1AEF:Lanna 1B00-1B7F:巴厘语 (Balinese) 1B80-1BB0:巽他语 (Sundanese) 1BC0-1BFF:Pahawh Hmong 1C00-1C4F:雷布查语(Lepcha) 1C50-1C7F:Ol Chiki 1C80-1CDF:曼尼普尔语 (Meithei/Manipuri) 1D00-1D7F:语音学扩展 (Phoneti
21、c Extensions) 1D80-1DBF:语音学扩展补充 (Phonetic Extensions Supplement) 1DC0-1DFF:结合用读音符号补充 (Combining Diacritics Marks Supplement) 1E00-1EFF:拉丁文扩充附加 (Latin Extended Additional) 1F00-1FFF:希腊语扩充 (Greek Extended) 2000-206F:常用标点 (General Punctuation) 2070-209F:上标及下标 (Superscripts and Subscripts) 20A0-20CF:货币符
22、号 (Currency Symbols) 20D0-20FF:组合用记号 (Combining Diacritics Marks for Symbols) 2100-214F:字母式符号 (Letterlike Symbols) 2150-218F:数字形式 (Number Form) 2190-21FF:箭头 (Arrows) 2200-22FF:数学运算符 (Mathematical Operator) 2300-23FF:杂项工业符号 (Miscellaneous Technical) 2400-243F:控制图片 (Control Pictures) 2440-245F:光学识别符 (
23、Optical Character Recognition) 2460-24FF:封闭式字母数字 (Enclosed Alphanumerics) 2500-257F:制表符 (Box Drawing) 2580-259F:方块元素 (Block Element) 25A0-25FF:几何图形 (Geometric Shapes) 2600-26FF:杂项符号 (Miscellaneous Symbols) 2700-27BF:印刷符号 (Dingbats) 27C0-27EF:杂项数学符号-A (Miscellaneous Mathematical Symbols-A) 27F0-27FF:
24、追加箭头-A (Supplemental Arrows-A) 2800-28FF:盲文点字模型 (Braille Patterns) 2900-297F:追加箭头-B (Supplemental Arrows-B) 2980-29FF:杂项数学符号-B (Miscellaneous Mathematical Symbols-B) 2A00-2AFF:追加数学运算符 (Supplemental Mathematical Operator) 2B00-2BFF:杂项符号和箭头 (Miscellaneous Symbols and Arrows) 2C00-2C5F:格拉哥里字母 (Glagolit
25、ic) 2C60-2C7F:拉丁文扩展-C (Latin Extended-C) 2C80-2CFF:古埃及语 (Coptic) 2D00-2D2F:格鲁吉亚语补充 (Georgian Supplement) 2D30-2D7F:提非纳文 (Tifinagh) 2D80-2DDF:埃塞俄比亚语扩展 (Ethiopic Extended) 2E00-2E7F:追加标点 (Supplemental Punctuation) 2E80-2EFF:CJK 部首补充 (CJK Radicals Supplement) 2F00-2FDF:康熙字典部首 (Kangxi Radicals) 2FF0-2FF
26、F:表意文字描述符 (Ideographic Description Characters) 3000-303F:CJK 符号和标点 (CJK Symbols and Punctuation) 3040-309F:日文平假名 (Hiragana) 30A0-30FF:日文片假名 (Katakana) 3100-312F:注音字母 (Bopomofo) 3130-318F:朝鲜文兼容字母 (Hangul Compatibility Jamo) 3190-319F:象形字注释标志 (Kanbun) 31A0-31BF:注音字母扩展 (Bopomofo Extended) 31C0-31EF:CJK 笔画 (CJK Strokes) 31F0-31FF:日文片假名语音扩展 (Katakana Phonetic
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1