1

我正在编写一个 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 相同的字符的任何建议?

4

3 回答 3

4

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

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

env TERM=linux ./a.out

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

于 2012-08-23T11:02:41.507 回答
1

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

于 2012-08-23T10:23:12.980 回答
1

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

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

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

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