ncurses中的奇怪扩展字符

w8f9ii69  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(98)

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

vsdwdz23

vsdwdz231#

ncurses根据您的termtype决定为ACS_LARROW和友元输出哪个字符。在tty中,你的termtype很可能被设置为“linux”,而在gnome-terminal等中,它很可能被设置为“xterm”。虽然我不确定,但xterm termtype很可能不支持这些字符。
你可以尝试这样运行你的应用程序:

env TERM=linux ./a.out

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

ct2axkht

ct2axkht2#

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

5kgi1eie

5kgi1eie3#

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

  • 区域设置
  • 图书馆选择
  • 特定终端仿真器

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

  • 如果在使用UTF-8的区域设置中使用前者(ncurses),ncurses将使用ASCII图形,因为它不能绘制UTF-8。ncursesw可以使用UTF-8字符进行绘制。
  • 使用ncursesw,程序将根据需要使用UTF-8(自2002年以来,它可以使用terminfo信息或内置的Unicode值表)。Linux控制台和screen是已知的特殊情况,其中terminfo不能描述终端的行为。对于其他终端(在UTF-8模式下不支持VT 100线条绘制的终端),您可以设置NCURSES_NO_UTF8_ACS
  • 终端数据库实际上有一个扩展的能力,解决了VT 100与UTF-8兼容性的不足(参见终端数据库中的U8注解)。但是,大多数人将TERM设置为xtermlinux,并且经常将 those 等同起来(参见xterm FAQ中的注解)。

相关问题