.\" Copyright (C) Markus Kuhn, 1996 .\" 中文版 Copyright (c) Bill Pan 和 www.LinuxForum.net .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, write to the Free .\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, .\" USA. .\" .\" 1995-11-26 Markus Kuhn .\" First version written .\" .TH UTF-8 7 "1995-11-26" "Linux" "Linux Programmer's Manual" .SH NAME UTF-8 \- ASCII 兼容的多字節 Unicode 編碼 .SH 描述 The .B Unicode 字符集使用的是 16 位(雙字節)碼。最普遍的 Unicode 編碼方法( .BR UCS-2 ) 由一個 16 位雙字序列組成。 這樣的字符串中包括了的一些如‘\\0’或‘/’這樣的在文件名中或者是在 C 庫函數中具有特殊意義的字符。 另外,如果沒有做重大的修正的話,大部分操作 ASCII 碼文件的 UNIX 工具不能夠正確識別 16 位的字符。因此, .B UCS-2 對於 .B Unicode 的文件名、文本文件、環境變量等等來說並不是一種合適的外部編碼方式。 .BR "ISO 10646 Universal Character Set (UCS)" , 是 Unicode 的超集,甚至使用了 31 位編碼方式, 另外還有使用 32 編碼的 UCS-4 也有同樣上述的問題。 .B UCS-4 而用 .B UTF-8 對 .B Unicode .B UCS 編碼 就不會存在這樣的問題。所以,UTF-8 很明顯的是在 UNIX 類操作系統下的 .B Unicode 字符集的解決方案。 .SH 屬性 .B UTF-8 編碼具有以下優良屬性: .TP 0.2i * .B UCS 字符從 0x00000000 到 0x0000007f (傳統的 .B US-ASCII 字符)簡單地編碼爲字節 0x00 到 0x7f (與 ASCII 碼兼容)。 這意味着只包含 7 位 ASCII 字符的文件和字符串在 .B ASCII 和 .BR UTF-8 . 編碼方式下是完全一樣的。 .TP * 所有大於 0x7f 的 .B UCS 字符被編碼成爲多字節序列。該序列全部是由 0x80 到 0fd 的字符組成, 這樣就不會有標準 ASCII 字符會 被作爲某個字的一個部分這種現象出現, 對於‘\\0’和‘\’這樣的特殊字符來說也就不會有問題了。 .TP * 保留了 .B UCS-4 字典中的字節串的排列順序。 .TP * 所有 2^32 次方的 UCS 碼都能夠使用 .BR UTF-8 來進行編碼。 .TP * 0xfe 和 0xff 兩個字符在 .B UTF-8 中不會被用到。 .TP * 表示非 ASCII 碼的 .B UCS 多字節串的開始字符總是 0xc0 到 0xfd 之間的字符,並會指出該串的長度。 多字節串的其他字符都是 0x80 到 0xbf 之間的字符。 這使得再同步非常簡單,並令編碼是無態的, 丟字節現象也不容易發生。 .TP * 用 .B UTF-8 編碼的 .B UCS 字符可以增加到 6 個字節的長度。而 .B Unicode 只能增加到 3 個字節長。由於 Linux 只使用 16 位的 .B Unicode , .BR UCS 的子集。所以在 Linux 下, .B UTF-8 多字節串長度最多不會超過三個字節。 .SH 編碼方式 下面的字節串用來表示一個字符。用什麼串依照該字符在 UCS 編碼中的序號來定: .TP 0.4i 0x00000000 - 0x0000007F: .RI 0xxxxxxx .TP 0x00000080 - 0x000007FF: .RI 110xxxxx .RI 10xxxxxx .TP 0x00000800 - 0x0000FFFF: .RI 1110xxxx .RI 10xxxxxx .RI 10xxxxxx .TP 0x00010000 - 0x001FFFFF: .RI 11110xxx .RI 10xxxxxx .RI 10xxxxxx .RI 10xxxxxx .TP 0x00200000 - 0x03FFFFFF: .RI 111110xx .RI 10xxxxxx .RI 10xxxxxx .RI 10xxxxxx .RI 10xxxxxx .TP 0x04000000 - 0x7FFFFFFF: .RI 1111110x .RI 10xxxxxx .RI 10xxxxxx .RI 10xxxxxx .RI 10xxxxxx .RI 10xxxxxx .PP 這裏 .I xxx 的位置二進制位形式的字符編碼填入。 只用最短的那個足夠表達一個字符編碼數的多字節串。 .SH 舉例說明 .B Unicode 字符 0xa9 = 1010 1001 (版權所有的符號) 在 UTF-8 中被編碼爲: .PP .RS 11000010 10101001 = 0xc2 0xa9 .RE .PP 字符0x2260 = 0010 0010 0110 0000 (“不等於”符號)被編碼爲: .PP .RS 11100010 10001001 10100000 = 0xe2 0x89 0xa0 .RE .SH 遵循標準 ISO 10646, Unicode 1.1, XPG4, Plan 9. .SH 作者 Markus Kuhn .SH 參考 .BR unicode (7) .SH "[中文版維護人]" .B billpan .SH "[中文版最新更新]" .BR 2000/11/09 .SH "《中國linux論壇man手冊頁翻譯計劃》:" .BI http://cmpp.linuxforum.net .SH "跋" .br 本頁面中文版由中文 man 手冊頁計劃提供。 .br 中文 man 手冊頁計劃:\fBhttps://github.com/man-pages-zh/manpages-zh\fR