在C中使用ncurses打印Unicode字符

xjreopfe  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(107)

我必须用C语言画一个盒子,使用ncurses;
首先,我定义了一些简单的值:

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

我用gcc编译过,在Ubuntu上,用-finput-charset=UTF-8标志。
但是,如果我尝试用addstr或printw打印,我会得到十六进制代码。我做错了什么?

6psbrbz9

6psbrbz91#

ncurses定义值ACS_HLINEACS_VLINEACS_ULCORNERACS_URCORNERACS_LLCORNERACS_LRCORNER。你可以在addch和friends中使用这些常量,这应该会导致你看到预期的框字符。(有更多的ACS字符;你可以在man addch中找到完整的列表。
ncurses需要知道它正在绘制什么,因为它需要始终准确地知道光标在哪里。输出控制台控制序列不是一个好主意;如果ncurses知道如何处理序列,那么它有自己的特性抽象,您应该使用该抽象。ACS(“alternate character set”)定义就是其中一种抽象。

hfyxw5xn

hfyxw5xn2#

几个问题:

  • 如果您的程序使用addstr编写类似"\e(0\x6a\e(B"的内容,那么ncurses(any curses implementation)将把单个字符转换为可打印的形式,如addch手册页中所述。
  • ncurses支持使用符号(如ACS_HLINE)对常用伪图形进行线条绘制,这些符号是结合了A_ALTCHARSET属性的预定义字符。您可以在addch手册页的 Line Graphics 部分阅读这些内容。
  • 代码0x6a是ASCII j,它(给定VT 100风格的Map)将位于左下角。其诅咒符号为ACS_LRCORNER
  • 不能用addstr书写画线字符;相反,addchaddchstr是有用。也有一些面向线绘制的函数(参见box和朋友)。
  • 运行在Ubuntu中,您的区域设置编码可能是UTF-8。要使程序正常工作,它应该按照ncurses手册页的“设置”部分中所述初始化区域设置。特别是:

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

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

6yjfywim3#

顺便说一句,我可能会迟到,但我会给予你一些额外的见解,可能(或不)棚一些光和技能,为您的“框画”的需要。
截至2020年,我参与了一个有趣的项目,在我自己的混合Swift + Ncurses(现在在OSX下,但考虑将其与Linux混合)。目前,它的工作毫无疑问...
问题是,当我使用Swift时,在内部它都简化为从MacOS Xcode/runtime提供的一些达尔文.ncurses库中“导入.h和.c”文件。
这意味着(我希望)我新获得的技能可能对您有用,因为显然我们正在使用相同的.h和.c文件来满足我们的ncurses需求(或者至少它们应该非常相似)
他说:
到目前为止,我“忽略”了ACS_corner字符(我在swift/Xcode/达尔文.ncurses运行时下找不到它们!!!)支持纯UTF“角字符”,这也存在于unicode点空间中,看:
https://en.wikipedia.org/wiki/Box-drawing_character
这是什么意思每当我想使用一些绘图框字符时,我只需将纯UTF-8字符复制并粘贴到字符串中,然后将这些字符串发送到addstr。
它为什么会起作用?因为正如在前面的回答中提到的,在用initscr()初始化ncurses之前,我只是以setlocale(LC_ALL,“”)的形式声明“我想要一个适当的locale支持”;线
我取得了什么成就?“舒适的魔术”,因为我只需要复制+粘贴“框字符”在我的“正常字符串”。使用达尔文.ncurses/OSX莫哈韦,我得到的不仅是“边界框字符”,而且是完全的UTF8支持。
尝试“setlocale(LC_ALL,“”); initscr();”方法并告诉我们“drawing boxes”是否也适用于纯C环境,只使用UTF8边界框字符。
问候和快乐ncursing!

相关问题