这份手册以程序员的眼光去看待不同的字符集标准,以及它们是如何 在 Linux 中调和在一起的。讨论的标准包括 ASCII,ISO 8859,KOI8-R , Unicode,ISO 2022 和 ISO 4873 。
在英国使用一种 ASCII的变体(这变体是:用英国磅值的符号代替美国的 crosshatch/octothorpe/hash 的磅值符号);当需要时, 美国的(符号)和英国的变体(符号)可以用"US ASCII"和"UK ASCII" 作为区别。
因为 Linux 是为美国设计的硬件写的, 它生来就支持 US ASCII 。
Linux 下控制台也支持其他的 8859 字符集 ,通过用户模式实用程序( 例如 setfont(8)) 来修改键盘绑定和 EGA 图形表格, 以及进行控制台驱动程序里的字体表格中的“user mapping(用户影射)”。
下面是每个集合简短的描述:
控制台为了支持 KOI8-R 字符集,在 Linux 下, 可以利用用户模式实用程序修改键盘绑定和 EGA 图形表格, 以及在控制台的驱动程序中使用字体表“user mapping(用户映射)”。
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 个不同的符号。这对于日语,汉语和朝鲜语来说是不够的, 但是它满足了大多数其它用途。
它有 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). LSn 把字符集Gn标记为当前字符集,用于高位为0的编码。 LSnR 把字符集 Gn标记为当前字符集,用于高位为1的编码。 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.