.\" 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