繁体   English   中英

使用 ncurses 在 C 中打印 Unicode 字符

[英]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_HLINEACS_VLINEACS_ULCORNERACS_URCORNERACS_LLCORNERACS_LRCORNER 您可以在addch和 friends 中使用这些常量,这应该会导致您看到预期的框字符。 (还有更多 ACS 字符;您可以在man addch中找到完整列表。)

ncurses需要知道它在画什么,因为它需要始终准确知道光标所在的位置。 输出控制台控制序列不是一个好主意; 如果 ncurses 知道如何处理序列,它有自己的功能抽象,您应该使用该抽象。 ACS(“备用字符集”)定义的是这些抽象之一。

几个问题:

  • 如果您的程序使用addstr编写类似"\e(0\x6a\e(B"的内容,则 ncurses(任何curses 实现)会将单个字符转换为可打印形式,如addch手册页中所述。
  • ncurses 支持使用符号(例如ACS_HLINE )为常用的伪图形绘制线条,这些符号是预定义字符与A_ALTCHARSET属性组合。 您可以在addch手册页的线图部分阅读有关内容。
  • 代码0x6a是 ASCII j ,它(给定 VT100 样式映射)将位于左下角。 curses 符号是ACS_LRCORNER
  • 不能用addstr写画线字符; 相反addchaddchstr很有用。 还有面向画线的功能(见box和朋友)。
  • 在 Ubuntu 中运行,您的语言环境编码可能是 UTF-8。 为了使您的程序正常工作,它应该按照 ncurses 手册页的初始化部分中的描述初始化语言环境。 特别是:

    设置语言环境(LC_ALL,“”);

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

  • 在 Ubuntu 上编译时,要使用正确的标头定义,您应该定义_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM