在 ncurses 中提取带有属性的宽字符

Extracting wide chars w/ attributes in ncurses

[请注意我使用的是 _XOPEN_SOURCE_EXTENDED 1setlocale(LC_CTYPE, "")。]

Curses 包括从屏幕中提取字符的各种函数;它们可以分为只抓取文本的和抓取文本加上属性(粗体、颜色等)的。前者使用wchar_t(或char),后者诅咒自己的chtype.

有一些常量可以屏蔽 chtype 以仅获取字符或属性 -- A_CHARTEXTA_ATTRIBUTES。但是从这些的值,很容易看出wchar_t的值超过255会有冲突。A_ATTRIBUTES是64位,只有低8位没有设置。

如果内部基类型是 chtype,这意味着 ncurses 不适用于大多数 unicode,但事实并非如此——您可以在 UTF-8 源代码中使用硬编码字符串并将它们写出属性没问题。有趣的是让他们再次回来。

wchar_t s[] = "2";

该字符的值为 266,显示为 Ċ。但是,当使用 mvwinchnstr() 提取到 chtype 时,它与设置了 COLOR_PAIR(1) 属性 (256) 的 space (10) 完全相同。事实上,如果您提取提取的 chtype 并重新显示它,您将得到那个 - space 和 COLOR_PAIR(1) 集。

但是如果你将它提取到 wchar_t 中,例如mvwinnwstr(),它是正确的,彩色的space也是如此。当然,这样做的问题是属性消失了。这意味着属性被正确屏蔽了,这对于 chtype 显然是不可能的,因为这两个的 chtype 具有相同的值 (266) .换句话说,内部表示 显然既不是 chtype 也不是 wchar_t.

我不怎么使用 ncurses,我注意到还有其他 curses 实现(例如 Oracle's),其功能暗示 chtype 那里 可能 没有这个问题。无论如何,有没有办法使用 ncurses 明确地提取宽字符及其属性?

[我标记了这个 C 和 C++,因为它适用于这两种情况。]

比这更复杂。但简而言之:

  • 在 SVr4 实现中,只有 chtype
  • X/Open 为多字节字符添加标准化工作,以 cchar_t.
  • 表示
  • 在 X/Open 文档中并不明显,但在相应的 Unix 实现中看到,chtypecchar_t 并未被设想为同一数据的可能不同视图。您只能使用前者进行 8 位编码。
  • 没有多少应用程序真正深入研究 Unix 实现以使其显而易见(事实上,至少有一个供应商的 XPG4 实现从来没有足够好地进行有用的测试——对于最先进的技术来说就这么多)。
  • 在 ncurses 中忽略了集成(或缺少集成),这似乎是很自然的事情。
  • ncurses 接受 addstr 中的多字节字符串(Unix 的 none)。
  • ncurses 尝试通过另一种设置的界面样式提供相同的信息。
  • 明显有局限性:chtype对应屏幕上的单个单元格,只能容纳一个8位字符。 winnstr which return a string will work within that constraint. The winchnstr 函数等接口执行 return chtype 个值的数组。
  • 如果您想要属性 不是 8 位字符的单元格,最好通过以下方式检索它类似的 win_wchnstr