使用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_HLINE
, ACS_VLINE
, ACS_ULCORNER
, ACS_URCORNER
, ACS_LLCORNER
和ACS_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
是ASCIIj
,(给定VT100样式的映射)将是左下角。 这个的curses符号是ACS_LRCORNER
。 - 你不能用
addstr
写出画线字符; 相反,addch
,addchstr
很有用。 还有一些面向画线的function(见box
和朋友)。 -
在Ubuntu中运行,您的语言环境编码可能是UTF-8。 为了使您的程序正常工作,它应该初始化语言环境,如ncurses手册页的初始化部分所述。 特别是:
setlocale(LC_ALL,“”);
此外,您的程序应该链接到ncurses w库(
-lncursesw
)以使用UTF-8,而不仅仅是ncurses(-lncurses
)。 - 在Ubuntu上编译时,要使用正确的头定义,您应该定义
_GNU_SOURCE
。