在 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
?)的特殊知识。
我正在使用 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
?)的特殊知识。