CHARSETS(7)

NAME
charsets - 程式員對字符集和國際化的觀點

描述
Linux 是一個國際性的作業系統。它的各種各樣實用程式和設 備驅動程式 (包括控制台驅動程式 ) 支持多種語言的字符集， 包括帶有附加符號的拉丁字母表字符，重音符，連字(字母結合), 和全部非拉丁文字母表（包括希臘語，古代斯拉夫語，阿拉伯語， 和希伯來語。 )

這份手冊以程式員的眼光去看待不同的字符集標準，以及它們是如何 在 Linux 中調和在一起的。討論的標準包括 ASCII，ISO 8859，KOI8-R ， Unicode，ISO 2022 和 ISO 4873 。

ASCII
ASCII (,美國國家信息交換(用)標準(代)碼) 是最初的 7-bit字符集, 原先是為美式英語設計的。當前它被 ECMA-6 標準所描述。

在英國使用一種 ASCII的變體（這變體是：用英國磅值的符號代替美國的 crosshatch/octothorpe/hash 的磅值符號）;當需要時， 美國的（符號）和英國的變體（符號）可以用"US ASCII"和"UK ASCII" 作為區別。

因為 Linux 是為美國設計的硬體寫的, 它生來就支持 US ASCII 。

ISO 8859
ISO 8859 是一系列 10 ８-bit 字符集,它包含美國 ASCII 的低位 (7 -bit ), 128 ～159 范圍內的不可見控制字符，和 96 個定寬圖形（字符）在 160-255 裏。 。LP 這些字符集中，最重要是 ISO 8859-1 ( Latin-1 )。 它生來就被 Linux 控制台驅動程式支持， X11R6 的支持得也很好，並且是 HTML 的基礎字符集。

Linux 下控制台也支持其他的 8859 字符集 ，通過使用者模式實用程式( 例如 setfont(8)) 來修改鍵盤綁定和 EGA 圖形表格， 以及進行控制台驅動程式裏的字型表格中的“ user mapping(使用者影射)”。

下面是每個集合簡短的描述：

8859-1 (Latin-1)
    Latin-1 覆蓋大多數的西歐語言，比如阿爾巴尼亞, 加泰羅尼亞語, 丹麥, 荷蘭,英語,法羅群島,芬蘭,法語,德語,加利西亞,愛爾蘭,冰島, 意大利，挪威，葡萄牙，西班牙和瑞典。缺少荷蘭的 ij連字（i與j合字） ， 法國的 oe（o與e合字）和舊風格的',,' 而德語中``（這樣的）引號是可以的。

8859-2 (Latin-2)
    Latin-2 支持大多數的拉丁文書寫的斯拉夫語和中歐的語言： 克羅地亞 , 捷克語, 德語, 匈牙利, 波蘭，羅馬尼亞，斯洛伐克， 和斯洛文尼亞。

8859-3 (Latin-3)
    Latin-3 是世界語,加裏西亞 , 馬耳他人, 和土耳其語作者受歡迎的（語言）。

8859-4 (Latin-4)
    Latin-4 介紹了愛沙尼亞語，拉托維亞，和立陶宛的字符 。它是實質上過時的; 參見 8859-10 (Latin-6 ) 。

8859-5
    古代斯拉夫語字母支持保加利亞語, 白俄羅斯語,馬其頓語, 俄語, 塞爾維亞語和烏克蘭語。 烏克蘭人讀帶有下挑筆的`geh'為`heh',和（當）需要用帶有上挑筆的 ghe 寫正確的ghe.參見下面的（關於）KOI8-R 的討論。 （譯注：這些外國人書寫習慣我們也不怎麼需要理解吧，希望上面的解釋不要 把人搞糊塗了）

8859-6
    支持阿拉伯語。 8859-6 字型表是分離字符格式的一種固定的字型，但是一個合適 的顯示引擎應該聯合這些來使用合適的詞首，中間字母，和最後表格式。

8859-7
    支持現代的希臘語。

8859-8
    支持希伯來語。

8859-9 (Latin-5)
    這是Latin-1 的一種變體，它用土耳其語的一些（字符）代替很少用的冰島語。

8859-10 (Latin-6)
    Latin 6 增加末因紐特(譯：對於last Inuit 我不知道是否是對的) (格陵蘭語) 和 Sami ( 拉普蘭語 ) ，這些是 Lattin 4 中缺少的，來覆蓋整個北歐地區（的字符集）。 RFC 1345 列出了初步的和不同的「 latin 6 "。 Skolt Sami 仍然比這些需要更多的 重音符號。

8859-13 (Latin-7)

8859-14 (Latin-8)

8859-15
    增加了歐洲符號和法國連字，它們是 Latin-1 裏缺漏的。

KOI8-R
KOI8-R 是在俄國流行的一個非 ISO 字符集。下半部分是 US ASCII; 上部是比 ISO 8859-5 設計的更好的古斯拉夫字符集。

控制台為了支持 KOI8-R 字符集，在 Linux 下， 可以利用使用者模式實用程式修改鍵盤綁定和 EGA 圖形表格， 以及在控制台的驅動程式中使用字型表「user mapping（使用者映射）」。

UNICODE（統[單]一代碼,寬[雙]字節字符集）
Unicode（ ISO 10646 ) 是一個標準，它的目標是明白地表現 在每種人類語言中的每種已知字符。Unicode 的編碼是 32 位的 ( 舊些的版本使用了 16 位 ) 。在 Unicode 的一些信息可以在<http://www.unicode.com>獲得。

Linux 使用８位的 Unicode 轉移格式 (UTF-8 ) 表示 Unicode 。 UTF-8 是可變長的 Unicode 編碼。使用１個字節給 7 bit 編碼，使用２個字節給 １１ bit 編碼， 使用３個字節給 １６ bit 編碼，使用４個字節給 ２１ bit 編碼，使用５個字節給 ２６ bit 編碼，使用６個字節給 ３１ bit 編碼

讓 0,1 , x 代表零，一，或任意的位。字節0xxxxxxx 代表Unicode 00000000 0xxxxxxx， 這個符號和 ASCII 0xxxxxxx 編碼的符號是一樣。 這樣， ASCII 沒有改為 UTF-8，並且只用 ASCII 的人不會注意到任何變化： 不在代碼，並且不在檔案大小。

字節 110xxxxx 是一個2 字節代碼的開始， 110xxxxx 10yyyyyy 組裝成 00000xxx xxyyyyyy 。 字節 1110xxxx 是一個 ３ 字節代碼的開始， 1110xxxx 10yyyyyy 10zzzzzz 被組裝成 xxxxyyyy yyzzzzzz。 （如果 UTF-8 使用 31-bit ISO 10646 編碼，那麼這個級數就會延伸 到 6 字節編碼）

對於 ISO-8859-1 的使用者而言，這意味著帶高位的字符編碼成兩個字節。 這會令普通的純文字檔增大１到２個百分點。不過沒有變換問題, 因為 Unicode ISO-8859-1 符號的值等於他們的 ISO-8859-1 值 (用 8 個前導零做前綴) 。對於日語的使用者，這意味著原來常用的 16 位編碼將 佔 3 個字節，並且還要求有擴展的映射表。許多日本人因此比較喜歡 ISO 2022 。

注意 UTF-8 是自我同步的： 10xxxxxx 是一條尾巴, 任何其它 的字節是編碼的頭。ASCII 字節出現在 UTF-8 流中唯一的可能是 作為自己出現。特別是, 不會有 NULs 或 " /'s 嵌入在那些比較大的編碼中。

因為編碼中的 ASCII，特別是, NUL 和'/', 沒有變化, 所以核心不會注意到 在使用 UTF-8。它根本不在乎它正在處理的那字節代表什麼東西。

Unicode 數據流的呈現通常是通過" subfont "表來操作，這個表是 Unicode 的一個子集到字符表格的映射。核心內部使用 Unicode 描述裝載入顯示記憶體的 subfont。這意味著在 UTF-8 中的一個模式 能使用 512 個不同的符號。這對於日語，漢語和朝鮮語來說是不夠的， 但是它滿足了大多數其它用途。

ISO 2022 AND ISO 4873
ISO 2022 和 4873 標準描述了一個基於 VT100 實現的字型控制模型． Linux 核心和 xterm (1) ( 部分 ) 支持這個模型。 它在日本和韓國很流行。

它有 4 個圖形的字符集，稱為 G0 ， G1 ， G2 和 G3 ，並且 其中之一是當前的高位為０ 的編碼的字符集(最初 G0 ),而他們之 一是當前的高位為１的編碼的字符集(最初 G1 )。每種圖形的字符集有 94 或 96 個字符 ，並且是實際上是一個 7-bit字符集。 它使用 040-0177 ( 041-0176 ) 或 0240-0377 ( 0241-0376 )編碼 中的一個。G0 大小總是為 94，並且使用 041-0176 之間的編碼。

字符之間切換用轉換（shift functions）功能 ^N (SO 或 LS1), ^O (SI 或 LS0), ESC n (LS2), ESC o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC | (LS3R). LSn 把字符集Gn標記為當前字符集，用於高位為０的編碼。 LSnR 把字符集 Gn標記為當前字符集，用於高位為１的編碼。 SSn 把字符集Gn (n=2 or 3) 標記為當前字符集， 只用於下一個字符（ 不管它的高位的值是什麼）

94 字符的集合用做 Gn 字符集是用一個逃逸序列 ESC ( xx （用於 G0），ESC ) xx （用於 G1）， ESC * xx （用於 G2），ESC + xx （用於 G3），等代表的．這裏的 xx 是一個符號 或者是在 ISO 2375 國際注冊編碼字符集中的一對符號。 例如，ESC ( @ 選用 ISO 646 字符集作為GO， ESC ( A 選用 UK 標準字符集(用磅代替數字記號), ESC ( B 選擇 ASCII ( 用美元代替流通貨幣), ESC ( M 為非洲語言選擇一個字符集， ESC ( ! A 選擇古巴字符集, 等等. 等等.

94 字符的集合用做 Gn 字符集是用一個逃逸序列 ESC - xx （對於 G1）, ESC . xx （對於 G2） 或 ESC / xx （對於 G3）等表示． 例如, ESC - G 選擇希伯萊字母表作為 G1.

多字節的字符集用做 Gn 字符集是用一個逃逸序列 ESC $ xx 或者 ESC $ ( xx （對於 G0）， ESC $ ) xx （對於 G1），ESC $ * xx （對於 G2），ESC $ + xx （對於 G3）等來表示． 例如, ESC $ ( C 為 G0選擇韓國字符集. 日本字符集合由 ESC $ B選擇 更多臨近的版本由ESC & @ ESC $ B選擇.

ISO 4873 規定了一個范圍比較窄的使用字符集，它的 G0是固定的 (總是 ASCII), 所以 G1, G2 和 G3只能被調用於高次序位編碼集。 尤其是，不再使用 ^N 和 ^O，ESC ( xx 僅用於 xx=B, 和 ESC ) xx, ESC * xx, ESC + xx 分別等價於 ESC - xx, ESC . xx, ESC / xx．

參考
console(4), console_ioctl(4), console_codes(4), ascii(7), iso_8859_1(7), unicode(7), utf-8(7)

[中文版維護人]
Scorpio <rawk@chinese.com>

[中文版最新更新]
2000/10/23

《中國linux論壇man手冊頁翻譯計劃》:
http://cmpp.linuxforum.net