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

时间:2016-06-15 20:32:49

标签: c ncurses

我正在用C开发一个ncurses应用程序。问题是putty会显示像ACS_VLINE这样的替代字符集字符作为字母。我的语言环境是

LANG=en_US.UTF-8

我已经设置了

export NCURSES_NO_UTF8_ACS=1

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

2 个答案:

答案 0 :(得分:5)

这是事物的组合。 PuTTY的推荐TERM"putty",但由于惯性,大多数人使用"xterm"。 xterm终端描述中的线条绘制支持与PuTTY的假设不同,因为xterm支持luit,这对备用字符集的管理方式有一些限制(参见{{3} }})。

如果使用infocmp进行比较,您可能会看到这些行处理备用字符集:

    acsc: '``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~', '``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~'.
    enacs: NULL, '\E(B\E)0'.
    rmacs: '\E(B', '^O'.
    smacs: '\E(0', '^N'.

VT100s可以有两个字符集"指定为",称为G0和G1:

  • " xterm"通过更改ASCII和线条绘制字符之间的G0指定来进行线条绘制,
  • " putty"线条图通过在G0中指定ASCII并在G1中指定线图并使用移入/移出控制字符在两者之间切换来工作。

虽然两者都兼容VT100,但xterm方案不适用于PuTTY。由于与luit的搭配,xterm的正常终端描述不会更改(除非证明可以修改luit以解决其用户的问题),因此解决方法PuTTY的用户需要:

  • 使用推荐的其他终端说明,例如TERM=putty。 PuTTY的设置对话框允许您设置环境变量以传递到远程计算机。

    这有一个缺点,即由于" size"某些系统没有安装完整的ncurses终端数据库。 (在我的本地机器上是6.8Mb)。此外,TERM可能不在允许的ssh环境变量列表中。

  • 您可以使用ncurses编译自己的terminfo条目' tic,例如,

    cat >foo <<"EOF" xterm|my terminfo entry, enacs=\E(B\E)0, rmacs=^O, smacs=^N, use=xterm-new, EOF tic foo

  • 使用GNU屏幕。它有自己的修复方法,恰好可以弥补PuTTY的问题。

进一步阅读

答案 1 :(得分:0)

我想补充一些内容。我遇到了同样的问题:Linux kenrel来源的许多基于ncurses的工具,例如dialogmenuconfignconfig,即使mc在使用ncurses构建时也会损坏(尽管{{1 }}是在许多操作系统上使用Slang构建的,并且不受影响。

这是发生了什么

ncurses使用terminfo中的mc记录切换到“替代字符集”,然后使用smacs绘制框。它发送acsc,它是备用字符集(ACS)中的绘图字符。 这是VT100图形。

如今,某些终端仿真器在UTF-8中不支持ACS,因为应用程序能够发送真实的箱形绘图代码点。

a中有一个非官方的功能U8(大写的U!)告诉ncurses:“而不是ACS使用真实的箱形绘图代码点。”

我具有terminfo的这项功能,还有腻子功能,但没有infocmp -x xterm-utf的能力。

您可以在xtermhttps://invisible-island.net/ncurses/man/ncurses.3x.html)中看到,ncurses(3)知道Linux控制台和GNU屏幕(以及tmux,它也将ncurses用作{{1 }}),并且总是像设置了screen一样。

对于其他在UTF中不支持ACS的终端,可以设置TERM

不幸的是,ncurses并不知道腻子。

还有U8可以将ACS转换为Unicode点。

因此,这是我们可以在UTF-8中运行ncurses +油灰的方法:

  • 使用具有NCURSES_NO_UTF8_ACS功能的终端。这是为腻子设置的(顺便说一句,我建议改用luit)。您可以使用U8#1putty-256color创建自己的条目,并使用U8#1进行编译。请注意,鼠标可能在不以colors#256开头的终端上不起作用(请参阅tic -x,“错误”部分)。这就是为什么我不使用xterm终端的原因。我建议复制mouseinterval(3),添加putty,进行编译并保持不变:它与腻子,鼠标和utf8完美结合。

  • 您可以在个人资料中设置xterm-utf8

  • 您可以运行colors#256NCURSES_NO_UTF8_ACS:它将screen设置为tmux并修复TERM

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

  • 自腻子0.71起,您甚至可以要求腻子在utf-8中支持ACS图纸

    Since putty 0.71 you can ask putty to support ACS drawings even in UTF-8

相关问题