使用ncurses以C语言打印Unicode字符
我必须用C语言画一个方框,使用ncurses 首先,为了简单起见,我定义了一些值:使用ncurses以C语言打印Unicode字符,c,string,gcc,unicode,ncurses,C,String,Gcc,Unicode,Ncurses,我必须用C语言画一个方框,使用ncurses 首先,为了简单起见,我定义了一些值: #define RB "\e(0\x6a\e(B" (ASCII 188,Right bottom, for example) 我已经在Ubuntu上用gcc编译了,带有-finput charset=UTF-8标志 但是,如果我尝试使用addstr或printw打印,我会得到hexa代码。 我做错了什么?ncurses定义了值ACS\u HLINE,ACS\u VLINE,ACS\u ULCORNER,AC
#define RB "\e(0\x6a\e(B" (ASCII 188,Right bottom, for example)
我已经在Ubuntu上用gcc编译了,带有-finput charset=UTF-8
标志
但是,如果我尝试使用addstr或printw打印,我会得到hexa代码。
我做错了什么?
ncurses
定义了值ACS\u HLINE
,ACS\u VLINE
,ACS\u ULCORNER
,ACS\u URCORNER
,ACS\u LLCORNER
和ACS\u lcorner
。您可以在addch
和friends中使用这些常量,这将导致您看到预期的框字符。(还有更多的ACS字符;您可以在man addch
中找到完整的列表)
ncurses
需要知道它在画什么,因为它需要知道光标一直在哪里。输出控制台控制序列不是一个好主意;如果ncurses知道如何处理序列,那么它对特性有自己的抽象,您应该使用该抽象。ACS(“替代字符集”)定义就是这些抽象之一。一些问题:
- 如果您的程序使用编写类似于
)的内容,那么ncurses(任何curses实现)将按照手册页面中的说明将单个字符转换为可打印的形式“\e(0\x6a\e(B”
- ncurses支持使用符号(如
)为常用的伪图形绘制线条,这些符号是与ACS\u HLINE
属性相结合的预定义字符。您可以在A\u ALTCHARSET
手册页面的一节中了解这些符号addch
- 代码
是ASCII0x6a
,它(给定VT100样式映射)将位于左下角。其诅咒符号是j
ACS\lru corner
- 您不能使用
来书写划线字符;相反,addstr
非常有用。还有一些面向划线的函数(请参阅和朋友)addch
- 在Ubuntu中运行时,您的区域设置编码可能是UTF-8。为了使您的程序正常工作,它应该按照ncurses手册页面的一节中所述初始化区域设置。特别是:
setlocale(LC_ALL,“”)
此外,您的程序应该链接到ncursesw库(
),以使用UTF-8,而不仅仅是ncurses(-lncursesw
)-lncurses
- 在Ubuntu上编译时,要使用正确的头定义,您应该定义
\u GNU\u SOURCE
到目前为止,我“忽略”了ACS_角字符(我在swift/Xcode/Darwin.ncurses runtime!!!)中找不到它们),而支持纯UTF“角字符”,它也存在于unicode点空间中,请看: 这意味着什么?每当我想使用一些绘图框字符时,我只需将纯UTF-8字符复制粘贴到字符串中,然后将这些字符串发送到addstr 为什么它能工作?因为正如上面有人回答的那样,在使用initscr()初始化ncurses之前,我只是以setlocale(LC_ALL,“”)行的形式声明“我需要适当的区域设置支持” 我实现了什么?显然是纯魔法。而且非常舒服,因为我只是在我的普通字符串中复制粘贴框字符。至少在Darwin.ncurses/OSX Mojave下,我得到的不仅是“边界框字符”,而且是完全的UTF8支持 尝试“setlocale(LC_ALL,”;initscr();”方法,告诉我们“绘图框”是否也适用于纯C环境,只需使用UTF8边界框字符
您好,祝您快乐!您能发布您用于打印的代码吗?您是否考虑过使用ncurses
border
功能?此外,您不需要-finput charset=UTF-8
,首先是因为它将是默认的,其次是因为您的源代码中没有一个非ascii字符(或者至少是您与我们共享的部分),这就是-finput charset
所指的:源代码本身的字符集。