[來源: http://icu.sourceforge.net/docs/papers/forms_of_unicode/]
UTF-8(ISO 10646-1) 有以下特性:
- UCS 字符 U+0000 到 U+007F (ASCII) 被編碼為字節(jié) 0x00 到 0x7F (ASCII 兼容).
這意味著只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8
兩種編碼方式下是一樣的.
- 所有 > U+007F 的 UCS 字符被編碼為一個(gè)或多個(gè)字節(jié)的串,
每個(gè)字節(jié)都有標(biāo)記位集. 因此, ASCII 字節(jié) (0x00-0x7F)
不可能作為任何其他字符的一部分.
- 表示非 ASCII 字符的多字節(jié)串的第一個(gè)字節(jié)總是在 0xC0 到 0xFD
的范圍里, 并指出這個(gè)字符包含多少個(gè)字節(jié).
多字節(jié)串的其余字節(jié)都在 0x80 到 0xBF 范圍里.
這使得重新同步非常容易, 并使編碼無國界,
且很少受丟失字節(jié)的影響.
- 可以編入所有可能的 231個(gè) UCS 代碼
- UTF-8 編碼字符理論上可以最多到 6 個(gè)字節(jié)長, 然而 16 位 BMP
字符最多只用到 3 字節(jié)長.
- Bigendian UCS-4 字節(jié)串的排列順序是預(yù)定的.
- 字節(jié) 0xFE 和 0xFF 在 UTF-8 編碼中從未用到.
下列字節(jié)串用來表示一個(gè)字符. 用到哪個(gè)串取決于該字符在 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 的位置由字符編碼數(shù)的二進(jìn)制表示的位填入. 越靠右的 x
具有越少的特殊意義.
只用最短的那個(gè)足夠表達(dá)一個(gè)字符編碼數(shù)的多字節(jié)串.
注意在多字節(jié)串中, 第一個(gè)字節(jié)的開頭"1"的數(shù)目就是整個(gè)串中字節(jié)的數(shù)目.
例如: Unicode 字符 U+00A9 = 1010 1001 (版權(quán)符號) 在 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, 當(dāng)然除非你指的是一個(gè)變量名而不是這種編碼本身.
什么編程語言支持 Unicode?
在大約 1993
年之后開發(fā)的大多數(shù)現(xiàn)代編程語言都有一個(gè)特別的數(shù)據(jù)類型, 叫做
Unicode/ISO 10646-1 字符. 在 Ada95 中叫 Wide_Character, 在 Java 中叫 char.
ISO C 也詳細(xì)說明了處理多字節(jié)編碼和寬字符 (wide characters) 的機(jī)制,
1994 年 9 月 Amendment 1 to ISO C
發(fā)表時(shí)又加入了更多. 這些機(jī)制主要是為各類東亞編碼而設(shè)計(jì)的,
它們比處理 UCS 所需的要健壯得多. UTF-8 是 ISO C
標(biāo)準(zhǔn)調(diào)用多字節(jié)字符串的編碼的一個(gè)例子, wchar_t
類型可以用來存放 Unicode 字符.
[來源: http://www.linuxforum.net/books/UTF-8-Unicode.html]