[英]Print Unicode characters in C, using ncurses
我必须使用 ncurses 在 C 中绘制一个框;
首先,为简单起见,我定义了一些值:
#define RB "\e(0\x6a\e(B" (ASCII 188,Right bottom, for example)
我在 Ubuntu 上用 gcc 编译,带有-finput-charset=UTF-8
标志。
但是,如果我尝试使用 addstr 或 printw 进行打印,我会得到六进制代码。 我做错了什么?
ncurses
定义了值ACS_HLINE
、 ACS_VLINE
、 ACS_ULCORNER
、 ACS_URCORNER
、 ACS_LLCORNER
和ACS_LRCORNER
。 您可以在addch
和 friends 中使用这些常量,这应该会导致您看到预期的框字符。 (还有更多 ACS 字符;您可以在man addch
中找到完整列表。)
ncurses
需要知道它在画什么,因为它需要始终准确知道光标所在的位置。 输出控制台控制序列不是一个好主意; 如果 ncurses 知道如何处理序列,它有自己的功能抽象,您应该使用该抽象。 ACS(“备用字符集”)定义的是这些抽象之一。
几个问题:
"\e(0\x6a\e(B"
的内容,则 ncurses(任何curses 实现)会将单个字符转换为可打印形式,如addch手册页中所述。ACS_HLINE
)为常用的伪图形绘制线条,这些符号是预定义字符与A_ALTCHARSET
属性组合。 您可以在addch
手册页的线图部分阅读有关内容。0x6a
是 ASCII j
,它(给定 VT100 样式映射)将位于左下角。 curses 符号是ACS_LRCORNER
。addstr
写画线字符; 相反addch
, addchstr
很有用。 还有面向画线的功能(见box
和朋友)。在 Ubuntu 中运行,您的语言环境编码可能是 UTF-8。 为了使您的程序正常工作,它应该按照 ncurses 手册页的初始化部分中的描述初始化语言环境。 特别是:
设置语言环境(LC_ALL,“”);
此外,您的程序应该链接到 ncurses w库 ( -lncursesw
) 以使用 UTF-8,而不仅仅是 ncurses ( -lncurses
)。
_GNU_SOURCE
。顺便说一句,也许我可能来晚了,但我会给你一些见解,可能会或不会为你的“盒子绘图”需求提供一些启发和技巧。
截至 2020 年,我参与了一个有趣的项目,我自己混合了 Swift + Ncurses(目前在 OSX 下,但考虑将其与 linux 混合)。 显然它完美无缺。
问题是,当我使用 Swift 时,它在内部都减少为来自 MacOS Xcode/runtime 提供的一些 Darwin.ncurses 库的“importing.h and.c”文件。
这意味着(我希望)我新获得的技能可能对您有用,因为显然我们正在使用完全相同的 .h 和 .c 文件来满足我们的 ncurses 需求。 (或者至少他们应该非常相似)
说:
截至目前,我“忽略”了 ACS_corner 字符(我在 swift/Xcode/Darwin.ncurses 运行时找不到它们,,:) 支持纯 UTF“角字符”,它也存在于 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();" 方法并告诉我们“绘图框”是否也适用于仅使用 UTF8 边界框字符的纯 C 环境。
问候和快乐 ncursing!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.