内核首先尝试确定任何给定用户字节所代表的符号,然后确定该符号在当前字体中的位置。
内核知道 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) 进行更改。