我必须使用ncurses在C中绘制一个方框;
首先,我为简单起见定义了一些值:
#define RB "\e(0\x6a\e(B" (ASCII 188,Right bottom, for example)
我使用gcc编译,通过Ubuntu,带有-finput-charset=UTF-8
标志。
但是,如果我尝试使用addstr或printw进行打印,我会得到hexa代码。 我做错了什么?
答案 0 :(得分:2)
顺便说一句,也许我可能晚些时候才去参加聚会,但我会为您提供一些见解,这些见解可能会为您的“盒装图纸”需求提供一些启发和技巧。
截至2020年,我参与了一个自己的Swift + Ncurses混合项目(目前在OSX下,但考虑将其与linux混合)一个有趣的项目。显然,它可以完美地工作。
问题是,当我使用Swift时,在内部它全部简化为从MacOS Xcode /运行时提供的某些Darwin.ncurses库中“导入.h和.c”文件。
(我希望)(我希望)我新获得的技能可能对您有用,因为显然我们在满足ncurses需求时使用了完全相同的.h和.c文件。 (或者至少它们应该非常相似)
说:
到目前为止,我“忽略”了ACS_corner字符(在swift / Xcode / Darwin.ncurses运行时下找不到它们!),而支持纯UTF“ corner chars”,它也存在于unicode点空间中,外观:
https://en.wikipedia.org/wiki/Box-drawing_character
是什么意思?每当我想在周围使用一些绘图框字符时,我只需将纯UTF-8字符复制并粘贴到我的字符串中,然后将这些字符串发送到addstr上。
为什么起作用?因为正如上面的回答,在使用initscr()初始化ncurses之前,我只是声称以setlocale(LC_ALL,“”)的形式表示“我想要适当的语言环境支持”;线。
我实现了什么?显然是纯魔术。而且非常舒服,因为我只是在普通字符串中复制粘贴了框字符。至少在Darwin.ncurses / OSX Mojave下,我得到的不仅是“边界字符”,还包括完整的UTF8支持。
尝试“ setlocale(LC_ALL,“”); initscr();“并告诉我们在纯C环境下仅使用UTF8边界框字符,“绘图框”是否也对您有用。
问候和幸福的抚弄!
答案 1 :(得分:1)
ncurses
定义了值ACS_HLINE
,ACS_VLINE
,ACS_ULCORNER
,ACS_URCORNER
,ACS_LLCORNER
和ACS_LRCORNER
。您可以在addch
和朋友中使用这些常量,这会导致您看到预期的框字符。 (还有更多ACS字符;您可以在man addch
中找到完整列表。)
ncurses
需要知道它正在绘制什么,因为它需要确切地知道光标的确切位置。输出控制台控制序列不是一个好主意;如果ncurses知道如何处理序列,它有自己的功能抽象,你应该使用该抽象。 ACS("备用字符集")定义是这些抽象之一。
答案 2 :(得分:1)
一些问题:
"\e(0\x6a\e(B"
之类的内容,则ncurses(任何 curses实现)会将各个字符转换为可打印格式,如{{3手册页。ACS_HLINE
)的常用伪图形的线条图,这些符号是A_ALTCHARSET
属性组合的预定义字符。您可以在addch
手册页的addch部分阅读相关内容。0x6a
是ASCII j
,其中(给定VT100样式的映射)将是左下角。这个的curses符号是ACS_LRCORNER
。addstr
写出画线字符;相反addch
,Line Graphics非常有用。还有一些面向画线的功能(参见addchstr
和朋友们)。在Ubuntu中运行,您的语言环境编码可能是UTF-8。为了使您的程序正常工作,它应该按照ncurses手册页的box
部分所述初始化语言环境。特别是:
setlocale(LC_ALL,“”);
此外,您的程序应该与ncurses w 库(-lncursesw
)链接以使用UTF-8,而不仅仅是ncurses(-lncurses
)。
_GNU_SOURCE
。