繁体   English   中英

ncurses中的奇怪扩展字符

[英]strange extended characters in 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相同字符的任何建议?

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

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

env TERM=linux ./a.out

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM