1. UCS简介
UCS,全称是Universal Character Set,是由Unicode Consortium和ISO联合制定的国际标准字符集。
UCS囊括了所有常用的各种自然语言、数学、音乐和其它各种领域的符号。
它的字符范围比传统的各国自行制定的字符集(主要覆盖本国使用的各种字符)范围更大,并且有能力在一个字符串中同时包括多种自然语言的字符而互不干扰(如一部分字符是英文,一部分法文,一部分中文,一部分日文,等等)。
2. 码点
UCS最多可以表示1,114,112个字符,编码范围从0到1,114,111。每个编码被称为码点(code point)。
在2012年9月发布的Unicode 6.2标准中,249,764 (22.4%)个码点已经被分配。其中包括:
- 110,182 (9.9%) 个码点已经分配给编码了的字符。其中109,976个是图形字符(有一部分不可见),206个是特殊用途的控制字符。
- 137,468 (12.3%) 个码点保留用于私有用途
- 2,048 个码点用于 surrogates。surrogates被设计用来扩充UTF-16能表达的字符范围。最初的UCS-2编码仅能表达BMP中的字符,扩充后可以表达17个平面的字符。
在UTF-16编码中,surrogates必须成对出现。一个非surrogates码点(共2个字节)表示一个BMP字符,一对surrogates码点(共4个字节)表示一个BMP之外平面的字符。
surrogates对的高位码点(high surrogates)范围是D800–DBFF,低位码点(low surrogates)范围是DC00–DFFF。两者组合可以表达0x400 x 0x400 = 0x100000个字符(即其它16个平面的字符)。一个surrogates对(H L)表达的非BMP字符的码点是:
码点 = 0x10000 + (H - 0xD800) * 0x400 + (L - 0xDC00)
- 66 个码点用于非字符使用(各plane的U+FFFE..U+FFFF,以及BMP的U+FDD0..U+FDEF)。这些字符可以由各实现方案自由使用,但不应用于数据交换。
另有864,348 (77.6%)个码点尚未分配。
3. 平面
UCS的字符被划分为17个平面(plane),每个平面有2^16个字符。在每个平面内,用2个字节即可表示一个字符。
常用字符都集中在plane 0。其它平面中的字符都非常特殊或罕见。
在2013年发布的Unicode 6.3标准中,仅如下6个平面的部分码点已被分配。其它平面都处于未分配状态。
plane 0(Basic Multilingual Plane,BMP),对应的码点范围为00000-0FFFF。包括了各种常用语言和文字中的字符。这个平面中的码点已经几乎分配完毕,仅有数千空余。该平面
包括了surrogates(D800-DFFF),另有一部分用于私有用途(E000-F8FF)- 共6400个。
plane 1(Supplementary Multilingual Plane,SMP),对应的码点范围为10000-1FFFF。
plane 2(Supplementary Ideographic Plane,SIP),对应的码点范围为20000-2FFFF。
...
plane 14(Supplementary Special-purpose Plane,SSP),对应的码点范围为E0000-EFFFF。
plane 15(Supplementary Private Use Area A,SPUA A),对应的码点范围为F0000-FFFFF。
plane 16(Supplementary Private Use Area B,SPUA B),对应的码点范围为100000-10FFFF。
每个平面可以进一步细分为块(block)。通常每个块中包括同一用途的类似字符。如:数学运算符,希伯来语。
BMP平面的最初128个码点分配给了ASCII字符,最初256个码点分配给了ISO 8859-1。
每个UCS字符都被分配了类别,有一个通用类别和一个字类别。
通用类别包括:
letter, mark, number, punctuation, symbol, or control
5. 属性列表
每个字符的属性包括:
Name, Code Point, Representative Glyph, General Category, Combining Class, Bidirectional Category, Bidirectional Mirrored, Bidirectional Mirroring Glyph, Decimal Digit Value, Digit Value,
Numeric Value, Ideographic, ...
6. 编码方式
常用的unicode编码方式有UTF-8和UTF-16。还有个很少使用的UTF-32,以及现在极少使用的UCS-2。
UTF-32
UTF-32是定长编码,使用4个字节。直接使用码点作为编码,可以表示所有UCS字符。
UTF-16
UTF-16是变长编码,可能是2个或4个字节。更早的UCS-2是一种定长的2个字节编码,直接使用码点作为编码,只能表示BMP平面内的字符。
High \ Low |
DC00 |
DC01 |
… |
DFFF |
D800 |
010000 |
010001 |
… |
0103FF |
D801 |
010400 |
010401 |
… |
0107FF |
? |
? |
? |
? |
? |
DBFF |
10FC00 |
10FC01 |
… |
10FFFF |
对码点范围:U+0000-U+D7FF 和 U+E000-U+FFFF,UTF-16直接使用码点作为字符编码。
对码点范围:U+D800-U+DFFF,UCS-2和UTF-16没有将它们分配给任何字符。
对码点范围:U+10000-U+10FFFF,UTF-16使用一对surrogates来表达每个字符。
码点 = 0x10000 + (H - 0xD800) * 0x400 + (L - 0xDC00)
UTF-16的字节次序:
在生成字符串时,应用应该在起始位置放置一个16位的标记整数0xFEFF,后续字符按应用自己的字节序编码。
即,如果字符是采用big-endian,那么最前面应该是FE,FF两个字符;如果字符是采用little-endian,那么最前面应该是FF,FE两个字符。
在读取字符串时,应用读取最开始的16位整数。如果读出来是0xFEFF,就不需要翻转字节。如果读出来是0xFFFE,就需要翻转字节。
如果生成字符串时没有放置标记整数,UTF-16缺省使用big-endian字节序,即little-endian系统需要翻转字节。但实际中,windows应用很多使用little-endian作为缺省字节序。
也可以采用UTF-16BE或UTF-16LE这两种编码方式明确表明使用的字节序。但这两个编码方式使用还不够普遍。
UTF-8
UTF-8是目前最为推荐使用的unicode编码方式。它是变长编码,可能是1个、2个、3个或者4个字节。
它
相比UTF-16的好处有:一般所需编码字节数更少;与ASCII兼容;没有字节序问题。
Bits of code point |
First code point |
Last code point |
Bytes in sequence |
Byte 1 |
Byte 2 |
Byte 3 |
Byte 4 |
Byte 5 |
Byte 6 |
7 |
U+0000 |
U+007F |
1 |
0xxxxxxx |
11 |
U+0080 |
U+07FF |
2 |
110xxxxx |
10xxxxxx |
16 |
U+0800 |
U+FFFF |
3 |
1110xxxx |
10xxxxxx |
10xxxxxx |
21 |
U+10000 |
U+1FFFFF |
4 |
11110xxx |
10xxxxxx |
10xxxxxx |
10xxxxxx |
The patterns below are not part of UTF-8, but were part of the first specification. |
26 |
U+200000 |
U+3FFFFFF |
5 |
111110xx |
10xxxxxx |
10xxxxxx |
10xxxxxx |
10xxxxxx |
31 |
U+4000000 |
U+7FFFFFFF |
6 |
1111110x |
10xxxxxx |
10xxxxxx |
10xxxxxx |
10xxxxxx |
10xxxxxx
|
参考资料
http://en.wikipedia.org/wiki/Universal_Character_Set_characters
http://en.wikipedia.org/wiki/UTF-32
http://en.wikipedia.org/wiki/UTF-16
http://en.wikipedia.org/wiki/UTF-8