charsets -
程式設計師對字符集和國際化的觀點
Linux
是一個國際性的作業系統。它的各種各樣實用程式和設
備驅動程式
(包括控制檯驅動程式 )
支援多種語言的字符集,
包括帶有附加符號的拉丁字母表字元,重音符,連字(字母結合),
和全部非拉丁文字母表(包括希臘語,古代斯拉夫語,阿拉伯語,
和希伯來語。 )
這份手冊以程式設計師的眼光去看待不同的字符集標準,以及它們是如何
在 Linux
中調和在一起的。討論的標準包括
ASCII,ISO 8859,KOI8-R , Unicode,ISO 2022 和
ISO 4873 。
ASCII
(,美國國家資訊交換(用)標準(代)碼)
是最初的 7-bit字符集,
原先是為美式英語設計的。當前它被
ECMA-6 標準所描述。
在英國使用一種
ASCII的變體(這變體是:用英國磅值的符號代替美國的
crosshatch/octothorpe/hash
的磅值符號);當需要時,
美國的(符號)和英國的變體(符號)可以用"US
ASCII"和"UK ASCII"
作為區別。
因為 Linux
是為美國設計的硬體寫的,
它生來就支援 US ASCII 。
ISO 8859 是一系列 10 8-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
是在俄國流行的一個非
ISO 字符集。下半部分是
US ASCII; 上部是比 ISO 8859-5
設計的更好的古斯拉夫字符集。
控制檯為了支援 KOI8-R
字符集,在 Linux 下,
可以利用使用者模式實用程式修改鍵盤繫結和
EGA 圖形表格,
以及在控制檯的驅動程式中使用字體表“user
mapping(使用者對映)”。
Unicode( ISO 10646 )
是一個標準,它的目標是明白地表現
在每種人類語言中的每種已知字元。Unicode
的編碼是 32 位的 (
舊些的版本使用了 16 位 )
。在 Unicode
的一些資訊可以在<
http://www.unicode.com>獲得。
Linux 使用8位的 Unicode
轉移格式 (UTF-8 ) 表示 Unicode 。
UTF-8 是可變長的 Unicode
編碼。使用1個位元組給
7 bit
編碼,使用2個位元組給
11 bit 編碼,
使用3個位元組給
16 bit
編碼,使用4個位元組給
21 bit
編碼,使用5個位元組給
26 bit
編碼,使用6個位元組給
31 bit 編碼
讓 0,1 , x
代表零,一,或任意的位。位元組0xxxxxxx
代表Unicode 00000000 0xxxxxxx,
這個符號和 ASCII 0xxxxxxx
編碼的符號是一樣。
這樣, ASCII 沒有改為
UTF-8,並且只用 ASCII
的人不會注意到任何變化:
不在程式碼,並且不在檔案大小。
位元組 110xxxxx 是一個2
位元組程式碼的開始,
110xxxxx 10yyyyyy 組裝成 00000xxx xxyyyyyy 。
位元組 1110xxxx 是一個 3
位元組程式碼的開始,
1110xxxx 10yyyyyy 10zzzzzz 被組裝成 xxxxyyyy
yyzzzzzz。 (如果 UTF-8 使用 31-bit ISO
10646
編碼,那麼這個級數就會延伸
到 6 位元組編碼)
對於 ISO-8859-1
的使用者而言,這意味著帶高位的字元編碼成兩個位元組。
這會令普通的文字檔案增大1到2個百分點。不過沒有變換問題,
因為 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 和 4873
標準描述了一個基於 VT100
實現的字型控制模型.
Linux 核心和 xterm (1) ( 部分 )
支援這個模型。
它在日本和韓國很流行。
它有 4
個圖形的字符集,稱為
G0 , G1 , G2 和 G3 ,並且
其中之一是當前的高位為0
的編碼的字符集(最初 G0
),而他們之
一是當前的高位為1的編碼的字符集(最初
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). LS
n
把字符集G
n標記為當前字符集,用於高位為0的編碼。
LS
nR 把字符集
G
n標記為當前字符集,用於高位為1的編碼。
SS
n 把字符集G
n (
n=2 or 3)
標記為當前字符集,
只用於下一個字元(
不管它的高位的值是什麼)
94 字元的集合用做 G
n
字符集是用一個逃逸序列
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 字元的集合用做 G
n
字符集是用一個逃逸序列
ESC - xx (對於 G1), ESC . xx
(對於 G2) 或 ESC / xx (對於
G3)等表示. 例如, ESC - G
選擇希伯萊字母表作為
G1.
多位元組的字符集用做
G
n
字符集是用一個逃逸序列
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 <[email protected]>
2000/10/23
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh