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