【问题标题】:strange extended characters in ncursesncurses中奇怪的扩展字符
【发布时间】:2012-08-18 19:57:48
【问题描述】:

我正在编写一个 ncurses 应用程序,但有一个奇怪的问题是如何将特殊字符打印到屏幕上。这是一个例子:

#include <ncurses.h>

int main(int argc, char *argv[])
{
  initscr();
  noecho();
  keypad(stdscr, TRUE);
  cbreak();
  curs_set(0);

  addch(ACS_LARROW);
  addch(' ');
  addch(ACS_UARROW);
  addch(' ');
  addch(ACS_DARROW);
  addch(' ');
  addch(ACS_RARROW);
  addch(' ');

  refresh();

  getch();

  endwin();

  return 0;
}

所以,当我在 tty 上运行它时,字符会正确打印为箭头(←、↑、↓、→),但是当我尝试在终端上运行它时(我在 gnome-terminal 和LXTerminal) 这是输出:

< ^ v >

这种差异有什么原因吗?我认为这可能与字体有关,但我真的不在我的领域,我的谷歌搜索没有帮助。

关于如何强制 lxterminal(或任何其他终端)输出与 tty 相同的字符有什么建议吗?

【问题讨论】:

    标签: c terminal character ncurses


    【解决方案1】:

    ncurses 根据您的术语类型决定为 ACS_LARROW 和朋友输出哪个字符。很可能在 tty 中,您的 termtype 设置为“linux”,而在 gnome-terminal 等中,它很可能设置为“xterm”。虽然我不确定,但很可能 xterm 术语类型不支持这些字符。

    您可以尝试这样运行您的应用程序:

    env TERM=linux ./a.out
    

    可以尝试的其他术语类型是 gnome、rxvt 和 vt102。这些将输出扩展的 ASCII 字符,您的终端仿真器应该支持它们。如果您安装了 rxvt-unicode,您也可以尝试它,它应该为这些特殊符号输出正确的 unicode 代码点。

    【讨论】:

    • 似乎是正确的方向,我正在谷歌搜索以查找更多信息;无论如何,如果我将 TERM 设置为 linux,则字符大多无法识别(很多问号),而使用 rxvt 和 rxvt-unicode 没有任何变化并且 gnome 返回错误。这与 lxterminal、xterm 和 gnome-terminal 一起使用。如果我尝试使用 rxvt 终端实例启动可执行文件,它可以正常工作,但出于这个原因,对我来说,它不是切换到 rxvt 的选项。
    • 嗯,很有可能在 gnome-terminals 当前配置中它无法生成这些字符。您可以重新配置它以模拟不同的终端。如果是这样,您可能既要这样做又要更改您的术语类型。
    • 是的,我的配置有问题。大部分都解决了,剩下的是linux问题,我要去别处问了。谢谢!
    【解决方案2】:

    终端仿真有时以 7 位 ASCII 编码,并且此代码页中的箭头(带有线和楔形)没有对应的值,因此终端显示接近的内容(即:仅楔形)。 在 tty 上,您拥有计算机的所有功能(UTF-8,颜色编码,...),因此终端可以绘制箭头。

    【讨论】:

    • 我检查了/usr/share/applications/lxterminal.dekstop,发现了这一行:Encoding=UTF-8。它不应该能够用 utf-8 打印箭头吗?如果我说了什么真的愚蠢的话,请容忍我。
    【解决方案3】:

    TERM 的设置在很大程度上无关紧要。重要的是

    • 语言环境
    • 图书馆的选择
    • 特定的终端仿真器

    通常的原因是程序是内置并链接到 ncurses 库而不是 ncursesw

    • 如果您在使用 UTF-8 的语言环境中使用前者 (ncurses),ncurses 将使用 ASCII graphics,因为它无法绘制 UTF-8。 ncursesw 可以使用UTF-8 characters 进行绘制。
    • 使用 ncursesw,程序将根据需要使用 UTF-8(因为 2002,它可以使用 terminfo 信息或内置的 Unicode 值表)。 Linux 控制台和screen 是已知的特殊情况,其中 terminfo 无法描述终端的行为。对于其他(不支持 UTF-8 模式下的 VT100 画线的终端),您可以设置NCURSES_NO_UTF8_ACS
    • 实际上,终端数据库确实具有解决 VT100 与 UTF-8 兼容性不足的扩展功能(请参阅终端数据库中的 U8 note)。但是,大多数人将 TERM 设置为 xtermlinux 并经常将那些等同起来(请参阅xterm FAQ 中的注释)。

    【讨论】:

      猜你喜欢
      • 2017-10-11
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多