即使导出NCURSES_NO_UTF8_ACS = 1,ACS字符也不能在putty中工作

Wil*_*ill 6 c ncurses

我自己在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.

Tho*_*key 6

这是事物的组合.推荐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:

  • "xterm"线条图通过更改ASCII和线条绘制字符之间的G0名称来工作,
  • "putty"线条图通过在G0中指定ASCII并在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的问题.

进一步阅读


use*_*142 6

我想做一些补充。我遇到了同样的问题:许多基于 ncurses 的工具,例如dialogmenuconfig以及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在您的个人资料中进行设置。

  • 您可以运行screentmux:它将设置TERMscreen并修复ncurses

  • 您可以运行luit:它将为您完成所有转换。

  • 从 putty 0.71 开始,你可以要求 putty 支持 ACS 绘图,即使是 UTF-8

    从 putty 0.71 开始,你可以要求 putty 支持 ACS 绘图,即使是 UTF-8