在 Raspbian Linux 中使用 ncursesw 访问从 0xF000 到 0xF0FF 的扩展 ASCII 字符集

Accessing the Extended ASCII Character Set from 0xF000 to 0xF0FF using ncursesw in Raspbian Linux

我正在使用 ncursesw 库在 C++ 的 Raspian Linux 中为非 GUI 文本终端编写应用程序。我无意中发现,如果您使用 A_ALTCHARSET(例如 mvwaddch(stdscr, 1, 1, A_ALTCHARSET | 65);)通过 mvwaddch 打印 anything,那么整个扩展 ASCII 字符集 (0 - 255) 将变为从索引 0xF000 开始可供 mvadd_wch 使用。

0xF000 似乎不是我的终端配置的 UTF-8 语言环境的官方映射。 ncursesw 库以某种方式触发系统加载这些字符。

这是怎么做到的?有没有一种方法可以加载这个字符集而无需先使用 A_ALTCHARSET 写入垃圾数据?

对于我的目的来说,在程序初始化时使用 mvwaddch(stdscr, 0, 0, A_ALTCHARSET); 打印空字符可能就足够了。但我还是想知道这里的幕后发生了什么。

供参考,这是我指的字符集:

ncurses 必须支持某些终端描述,这些终端描述发送“8 位”代码以实现备用字符集功能。 Linux 控制台恰好是 commonly-used 案例。 source-code 中有几个地方有助于理解,例如 update-code.

/*
 * If the character falls into any of these special cases, do
 * not force the result to a blank:
 *
 * a) it is printable (this works around a bug in wcwidth()).
 * b) use_legacy_coding() has been called to modify the treatment
 *    of codes 128-255.
 * c) the acs_map[] has been initialized to allow codes 0-31
 *    to be rendered.  This supports Linux console's "PC"
 *    characters.  Codes 128-255 are allowed though this is
 *    not checked.
 */

Linux 控制台没有 PC-character 集(console_codes manual page mentions only UTF-8 and ISO-8859-1), but the showconsolefont command uses a Linux ioctl to allow it to print a table of 256 codes, which depending upon the font which has been loaded, will match some PC code-page (see my answer to Why does showconsolefont have different output in tmux?)的特殊知识。