下一页 上一页 目录

6. 控制台字符集

内核首先尝试确定任何给定用户字节所代表的符号,然后确定该符号在当前字体中的位置。

内核知道 5 种将字节转换为控制台屏幕符号的转换方式。在 Unicode (UTF-8) 模式下,UTF-8 代码直接转换为 Unicode。假设用户需要的几乎所有符号都存在于 Unicode 中,对于不适用的情况,代码 0xf000-0xf1ff 保留用于直接字体访问。当不处于 Unicode 模式时,将使用四个转换表之一。这四个表是:a) Latin1 -> Unicode,b) VT100 图形 -> Unicode,c) PC -> Unicode,d) 用户自定义。

有两个字符集,称为 G0 和 G1,其中一个是当前字符集。(初始为 G0。)键入 Ctrl-N 会使 G1 变为当前字符集,Ctrl-O 会使 G0 变为当前字符集。

这些变量 G0 和 G1 指向一个转换表,可以由用户更改。最初,它们分别指向表 a) 和 b)。序列 ESC ( B、ESC ( 0、ESC ( U 和 ESC ( K 使 G0 分别指向转换表 a)、b)、c) 和 d)。序列 ESC ) B、ESC ) 0、ESC ) U 和 ESC ) K 使 G1 分别指向转换表 a)、b)、c) 和 d)。

序列 ESC c 会导致终端重置,这正是您在屏幕全部乱码时所需要的。经常建议的 echo ^V^O 仅使 G0 变为当前字符集,但不能保证 G0 指向表 a)。在某些发行版中,有一个程序 reset(1) 只是执行 echo ^[c。如果您的控制台 termcap 条目正确(并且有一个条目 :rs=\Ec:),那么 setterm -reset 也将起作用。

用户自定义的映射表可以使用 mapscrn(8) 进行设置。映射的结果是,如果打印符号 c,则符号 s = map[c] 将被发送到视频内存。与 s 对应的位图在字符 ROM 中找到,可以使用 setfont(8) 进行更改。


下一页 上一页 目录