ncurses中奇怪的扩展字符

时间:2012-08-23 10:06:42

标签: c terminal character ncurses

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

3 个答案:

答案 0 :(得分:4)

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

您可以尝试按以下方式运行您的应用程序:

env TERM=linux ./a.out

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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中的注释)。