[来源: http://icu.sourceforge.net/docs/papers/forms_of_unicode/]
UTF-8(ISO 10646-1) 有以下特性:
- UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容).
这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8
两种编码方式下是一样的.
- 所有 > U+007F 的 UCS 字符被编码为一个或多个字节的串,
每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F)
不可能作为任何其他字符的一部分.
- 表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD
的范围里, 并指出这个字符包含多少个字节.
多字节串的其余字节都在 0x80 到 0xBF 范围里.
这使得重新同步非常容易, 并使编码无国界,
且很少受丢失字节的影响.
- 可以编入所有可能的 231个 UCS 代码
- UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP
字符最多只用到 3 字节长.
- Bigendian UCS-4 字节串的排列顺序是预定的.
- 字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode
中的序号.
U-00000000 - U-0000007F: |
0xxxxxxx |
U-00000080 - U-000007FF: |
110xxxxx 10xxxxxx |
U-00000800 - U-0000FFFF: |
1110xxxx 10xxxxxx 10xxxxxx |
U-00010000 - U-001FFFFF: |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
U-00200000 - U-03FFFFFF: |
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
U-04000000 - U-7FFFFFFF: |
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
|
xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x
具有越少的特殊意义.
只用最短的那个足够表达一个字符编码数的多字节串.
注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.
例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8
里的编码为:
11000010 10101001 = 0xC2 0xA9
而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:
11100010 10001001 10100000 = 0xE2 0x89 0xA0
这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation
Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8)
来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身.
什么编程语言支持 Unicode?
在大约 1993
年之后开发的大多数现代编程语言都有一个特别的数据类型, 叫做
Unicode/ISO 10646-1 字符. 在 Ada95 中叫 Wide_Character, 在 Java 中叫 char.
ISO C 也详细说明了处理多字节编码和宽字符 (wide characters) 的机制,
1994 年 9 月 Amendment 1 to ISO C
发表时又加入了更多. 这些机制主要是为各类东亚编码而设计的,
它们比处理 UCS 所需的要健壮得多. UTF-8 是 ISO C
标准调用多字节字符串的编码的一个例子, wchar_t
类型可以用来存放 Unicode 字符.
[来源: http://www.linuxforum.net/books/UTF-8-Unicode.html]