我自己在C中开发一个ncurses应用程序。问题是putty会显示像ACS_VLINE这样的替代字符集字符作为字母。我的地方是
LANG=en_US.UTF-8
我已经定了
export NCURSES_NO_UTF8_ACS=1
我也把putty设置为UTF-8并尝试了不同的字体。实际机器上的tty上的字符显示正常,所以我认为问题在于putty。我也尝试过连接ncursesw而不是ncurses。
这是事物的组合。推荐用于PuTTY的TERM
是"putty",但由于惯性,大多数人使用"xterm"。 xterm终端描述中的线条绘制支持与PuTTY的假设不同,因为xterm支持luit,这对备用字符集的管理方式有一些限制(请参阅Debian Bug report #254316:
ncurses-base: workaround for screen's handling of register sgr0 isn't quite right)。
如果使用infocmp
进行比较,您可能会看到这些行处理备用字符集:
acsc: '``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~', '``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~'.
enacs: NULL, '\E(B\E)0'.
rmacs: '\E(B', '^O'.
smacs: '\E(0', '^N'.
VT100可以有两个“指定”的字符集,称为G0和G1:
虽然两者都兼容VT100,但xterm方案不适用于PuTTY。由于与luit
的搭配,xterm
的正常终端描述不会改变(除非证明可以修改luit
以解决其用户的问题),因此PuTTY用户需要一个解决方法:
TERM=putty
。 PuTTY的设置对话框允许您设置环境变量以传递到远程计算机。
这有一个缺点,即由于“大小”(在我的本地机器上为6.8Mb),某些系统没有安装完整的ncurses终端数据库。此外,TERM
可能不在允许的ssh环境变量列表中。cat >foo <<"EOF"
xterm|my terminfo entry,
enacs=\E(B\E)0,
rmacs=^O,
smacs=^N,
use=xterm-new,
EOF
tic foo
进一步阅读
我想做一些补充。我遇到了同样的问题:许多基于ncurses的工具,如来自Linux kenrel源的dialog
,menuconfig
和nconfig
,甚至mc
在使用ncurses构建时都会被破坏(尽管mc
是在许多操作系统上使用Slang构建的,并且没有受到影响)。
这是发生了什么
ncurses使用来自terminfo的smacs
记录切换到“alternative charset”,然后使用acsc
绘制框。它发送a
,它是备用字符集(ACS)中的盒子绘图字符。这是VT100图形。
现在一些终端仿真器在UTF-8中不支持ACS,因为应用程序能够发送真正的盒子绘图代码点。
在U8
中有非官方的能力terminfo
(首都U!)告诉ncurses:“而不是ACS使用真正的盒子绘制代码点。”
我有这种能力qazxsw poi和腻子,但不适用于qazxsw poi。
你可以在infocmp -x xterm-utf
(xterm
)中看到,ncurses(3)
知道Linux控制台和GNU屏幕(以及tmux,它也使用https://invisible-island.net/ncurses/man/ncurses.3x.html作为ncurses
)并且总是表现得像screen
设置。
对于在UTF中不支持ACS的其他终端,您可以设置TERM
。
不幸的是,诅咒并不知道腻子。
还有U8
可以将ACS转换为Unicode点。
那么,这是我们在UTF-8中运行ncurses + putty所能做的:
NCURSES_NO_UTF8_ACS
功能的终端。这个是为putty设置的(顺便说一句,我建议使用luit
代替)。您可以使用U8#1
和putty-256color
创建自己的条目,并使用U8#1
进行编译。请注意,鼠标可能无法在不以colors#256
开头的终端上工作(请参阅tic -x
,BUGS部分)。这就是为什么我不使用xterm
终端。我建议复制mouseinterval(3)
,添加putty
,编译并保持它:它与putty,mouse和utf8完美配合。xterm-utf8
。colors#256
或NCURSES_NO_UTF8_ACS
:它会将screen
设置为tmux
并修复TERM
screen
:它将为您完成所有转换。ncurses