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

问题描述 投票:5回答:2

我自己在C中开发一个ncurses应用程序。问题是putty会显示像ACS_VLINE这样的替代字符集字符作为字母。我的地方是

LANG=en_US.UTF-8

我已经定了

export NCURSES_NO_UTF8_ACS=1

我也把putty设置为UTF-8并尝试了不同的字体。实际机器上的tty上的字符显示正常,所以我认为问题在于putty。我也尝试过连接ncursesw而不是ncurses。

c ncurses
2个回答
5
投票

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

  • “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的问题。

进一步阅读


0
投票

我想做一些补充。我遇到了同样的问题:许多基于ncurses的工具,如来自Linux kenrel源的dialogmenuconfignconfig,甚至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-utfxterm)中看到,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#1putty-256color创建自己的条目,并使用U8#1进行编译。请注意,鼠标可能无法在不以colors#256开头的终端上工作(请参阅tic -x,BUGS部分)。这就是为什么我不使用xterm终端。我建议复制mouseinterval(3),添加putty,编译并保持它:它与putty,mouse和utf8完美配合。
  • 您可以在个人资料中设置xterm-utf8
  • 你可以运行colors#256NCURSES_NO_UTF8_ACS:它会将screen设置为tmux并修复TERM
  • 您可以运行screen:它将为您完成所有转换。
  • 因为putty 0.71你甚至可以在UTF-8中使用putty来支持ACS绘图 ncurses
© www.soinside.com 2019 - 2024. All rights reserved.