我想使用旧的 VT420 终端作为系统控制台。添加 RS232 端口和设置serial-getty
不是问题,但是:多年来,几乎所有 Linux 发行版都使用 UTF-8 作为标准字符集,而 VT 仅支持 Latin-1 (ISO 8859-1) 和旧的 DEC 多国字符集。
那么:我该怎么做才能serial-getty
使用终端支持的字符集之一?有没有易于实施的解决方案?我目前的发行版是:
- OpenSuSE Leap 15.6
- OpenWRT,当前版本
请注意,VT420 确实允许定义自定义(位图)字符,但这很辛苦。
getty 不定义字符集。您运行的程序会输出它们想要输出的任何字节,并且大多数程序使用 libc 区域设置系统来确定您要使用的编码或字符集 - 简而言之,您的
LANG
或LC_CTYPE
环境变量。(有关更多详细信息,请参阅 nl_langinfo(3) 手册页。)例如,具有
LANG=en_US.utf8
或C.UTF-8
表示程序应该输出 UTF-8,而普通en_US
通常定义为使用 ISO-8859-1。根据发行版的不同,额外的语言环境可能
locale -a
默认可用,或者您可能需要通过编辑/etc/locale.gen
或其他发行版特定的魔法(dpkg-reconfigure locales、eselect locale 等)来构建它们,或者 – 如果您运行的是基于 Musl 的发行版 – 它们可能根本不可用。(语言环境C
始终内置,但它定义的是 7 位 ASCII,而不是 ISO-8859。)一旦列表中有了 en_US 语言环境
locale -a
,就可以导出LC_CTYPE=en_US
以覆盖您通常拥有的任何 LANG,然后运行locale charmap
以验证结果。(实际选择的语言并不重要,因为 LC_CTYPE 只会影响字符集,而不会影响其他任何内容;例如,日期格式仍将基于您的 LANG。)通常 LANG 是通过 PAM(pam_env)或通过登录 shell 的 /etc/profile 设置的 - 同样取决于分布 - 但像这样特定于 tty 的调整可能最好在您的 ~/.profile 或甚至您的 ~/.bashrc 中完成。
并非所有程序都支持区域设置字符集;有些程序始终输出 UTF-8。在这种情况下,您可能需要尝试
luit
Xterm 附带的“代理”工具(尽管它通常具有完全相反的用途 - 它会转换为UTF-8),或者尝试获取tmux
或screen
执行转换。