使用ncurses在C中打印Unicode字符

我必须使用ncurses在C中绘制一个方框;

首先,为简单起见,我定义了一些值:

#define RB "\e(0\x6a\e(B" (ASCII 188,Right bottom, for example) 

我已经使用gcc编译,通过Ubuntu,使用-finput-charset=UTF-8标志。

但是,如果我尝试使用addstr或printw进行打印,我会得到hexa代码。 我做错了什么?

ncurses定义值ACS_HLINEACS_VLINEACS_ULCORNERACS_URCORNERACS_LLCORNERACS_LRCORNER 。 您可以在addch和friends中使用这些常量,这将导致您看到预期的框字符。 (还有更多的ACS角色;你会在man addch找到一个完整的列表。)

ncurses需要知道它绘制的是什么,因为它需要确切地知道光标的确切位置。 输出控制台控制序列不是一个好主意; 如果ncurses知道如何处理序列,它有自己的function抽象,你应该使用该抽象。 ACS(“备用字符集”)定义是这些抽象之一。

一些问题:

  • 如果你的程序写了类似"\e(0\x6a\e(B"使用addstr ,那么ncurses( 任何 curses实现))将单个字符转换为可打印的forms,如addch手册页中所述。
  • ncurses支持使用符号(例如ACS_HLINE )的常用伪图形的线条图,这些符号是组合了A_ALTCHARSET属性的预定义字符。 您可以在addch手册页的Line Graphics部分阅读这些内容。
  • 代码0x6a是ASCII j ,(给定VT100样式的映射)将是左下角。 这个的curses符号是ACS_LRCORNER
  • 你不能用addstr写出画线字符; 相反, addchaddchstr很有用。 还有一些面向画线的function(见box和朋友)。
  • 在Ubuntu中运行,您的语言环境编码可能是UTF-8。 为了使您的程序正常工作,它应该初始化语言环境,如ncurses手册页的初始化部分所述。 特别是:

    setlocale(LC_ALL,“”);

    此外,您的程序应该链接到ncurses w库( -lncursesw )以使用UTF-8,而不仅仅是ncurses( -lncurses )。

  • 在Ubuntu上编译时,要使用正确的头定义,您应该定义_GNU_SOURCE