[英]How does ncurses output non-ascii characters?
我想知道ncurses(ac库)如何将├
字符放入,尽管(据我所知)它们并不是ASCII的一部分。
我本以为只是按像素绘制它们,但是您可以将它们复制/粘贴到终端之外(在MacOS中)。
ncurses通过假定您的语言环境环境变量( LC_ALL
和/或LC_CTYPE
)与您正在显示的终端匹配来在屏幕上放置诸如├之类的字符。 环境变量指示编码 (例如,UTF-8)。 还有其他编码和支持这些编码的终端,但是通常来说,您通常会看到UTF-8。 如果环境和终端合作,那么事情“就可以了”:
setlocale
检查程序已初始化的语言环境,并确定该语言环境是否使用UTF-8。 稍后将使用该信息。 addstr
,ncurses使用字符类型信息(设置为调用setlocale
的副作用),并使用标准C库函数来组合组成多字节字符的字节序列,并将其转换为宽字符 。 它在内部存储那些宽字符,并且 但是-
├
字符是特殊情况。 这是用于线条画的图形字符之一,它早于Unicode和UTF-8。 curses具有这些图形字符的名称,可以轻松地引用它们,例如ACS_LTEE
( ├
是左三通):
进一步阅读:
ncurses的版本不止一个,且平台不止一个,如果您真的想知道,请查看源代码。 但是,它们都不会逐个像素地绘制一个字符。 那不是在终端仿真器中运行的库所要做的。
C标准库,POSIX和ncurses的现代版本均支持向控制台写入宽字符以及在宽字节字符串与多字节字符串之间进行转换。 今天,宽字符通常是UTF-16或UTF-32,而多字节字符串通常是UTF-8。 您可以参阅<wchar.h>
和ncursesw的文档以了解更多信息。
请注意,C11确实通过u8
前缀支持UTF-8文字。
如果程序关心本地多字节编码不是UTF-8的系统的可移植性,则可以使用其他库(例如C ++标准库或ICU)在UTF-8和宽字符字符串之间进行转换,然后显示带有curses的字符串。
您可能需要#define _XOPEN_SOURCE 700
或目标标准版本的适当值,并且对于某些版本的库,还需要#define _XOPEN_SOURCE_EXTENDED 1
,以使系统库允许使用诸如addwstr之类的功能() 。
但是,许多程序可能只是将以UTF-8编码的char
字符串发送到控制台,并假定它可以处理它们。 我不推荐这种方法,但它在2017年适用于大多数Linux系统。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.