Ctrl我正在尝试在 Fedora 12 上使用 Curses 将状态信息输出到 VT(您可以通过按+ Alt+访问的终端之一Fx)。
当我在其中一个 VT ( ) 上启动应用程序时,$TERM=linux
框的行会显示为字符,例如j
、q
和k
其他一些字符。然而,当我在终端窗口 ( $TERM=xterm
) 中启动它时,一切都会按预期显示。
有人可以向我解释一下我需要做什么才能让 VT 输出显示为 xterm 吗?我可以在程序中设置终端设置以使输出正确吗?
答案1
一个好的答案应该首先用自己的话解释问题,然后有选择地引用相关的部分。在里面ncurses 常见问题解答部分@Craig 提出,有一个方面没有详细说明,这有助于理解这个问题。
参考线条图形的部分术语信息(5)手册页,以及相应的线条图形的部分curs_add(3x)手册页中,curses 库有一组预定义的符号常量,名为ACS_xxxx它们是在各种终端上使用类似的转义序列绘制的。
最常见的变体基于 VT100,其中应用程序发送特殊字符(或转义序列)来启动线条图形模式和另一个字符(或转义序列)来结束线条图形。
一些终端仿真器开发人员反对这个概念模式以 UTF-8 模式写入文本时。别介意讽刺(有用于启动/停止 UTF-8 编码的转义序列),但 ncurses 可以高效地支持此功能。为了帮助它决定如何制作线条图形,
- 它以终端描述(由环境变量标识)开始,它只能告诉您如何进行 VT100 风格的线条图形。
- 对于UTF-8,它可以通过检查其他环境变量来检查区域设置编码。
如果 ncurses 必须仅使用 UTF-8(因为终端不支持 VT100 线条图形),则它会使用足够好的 Unicode 值的内置表。使用 UTF-8 绘制线条不可避免地比使用 VT100 绘制线条慢三倍,原因很简单,因为发送到终端的字符数量是使用 VT100 的三倍。
所有这些使得 UTF-8 画线成为“也”,而不是该库的主要焦点。在OP的例子中,有些东西(可能是语言环境变量)不正确。 Fedora 以 UTF-8 模式初始化控制台,而 Linux 控制台是一个众所周知的案例,省略了 VT100 线条绘制,OP 在屏幕上出现了奇怪的字符。
由于 ncurses 将 OP 环境解释为支持终端描述中的功能,因此它切换到 VT100 线条绘制模式(由于覆盖模式而被控制台忽略),并绘制了它期望映射到线条中的字符。所以它可能会像这样出现在屏幕上:
lqqqqqqqqqqqqqqqk
x Hello world x
mqqqqqqqqqqqqqqqj
而不是
┌───────────────┐
│ Hello world │
└───────────────┘
答案2
来自 ncurses 常见问题解答http://invisible-island.net/ncurses/ncurses.faq.html
画线字符显示为 x 和 q
x 和 q 对应于一个表(来自 terminfo/termcap),该表告诉 ncurses 如何将“备用”字符集映射到终端的图形字符集。该表的参考来自 vt100。如果出现未映射的字符,则终端仿真器无法识别 terminfo 描述中给出的用于在正常字体和备用字体之间切换的转义序列。
有几种情况值得注意:
- 使用不同的转义序列或不同的范围来映射结果字符的终端模拟器。例如所谓的 vt100 兼容产品,如 Linux 控制台和 Tera Term。
- 区域设置敏感的终端模拟器。同样,Linux 控制台在 UTF-8 模式下运行时也是一个问题区域,因为忽略处理字体的转义序列会进一步削弱其名义上的 vt100 兼容性。 screen实用程序也有同样的问题;无论是为了简化实现还是复制 Linux 控制台,当语言环境为 UTF-8 风格时,它都会忽略 vt100 风格的字体切换。
- 如果您碰巧使用 Solaris,则通常将其配置为优先使用其终端数据库而不是 ncurses,即使安装了 ncurses 也是如此。然而,它的 xterm 终端描述省略了用于启用画线的 enacs。这对于 screen 和 luit 等应用程序来说效果不佳。
对于第一种情况,您只需找到正确的 terminfo 描述即可。修复后者比较困难,因为损坏是在 ncurses 之外造成的。 (尽管可以轻松地使事物足够兼容,从而使这一特定问题永远不会出现,但某些编码人员认为这种解决方案风格并不合适)。
普通的 ncurses 库支持 8 位字符。 ncurses 库还可以配置(--enable-widec)以支持宽字符(例如 Unicode 和 UTF-8 编码)。相应的宽字符 ncursesw 库与普通应用程序源兼容。也就是说,应用程序必须针对 ncursesw 库进行编译和链接。
ncurses 5.3 版本提供 UTF-8 支持。 Linux 控制台和屏幕的特殊情况已在 2002 年底完成的开发补丁中得到解决。