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

时间:2015-05-12 18:16:44

标签: c++ c ncurses curses

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

Curses包括从屏幕中提取字符的各种功能;它们可以分为仅抓取文本的那些以及抓取文本和属性(粗体,颜色等)的那些。前者使用wchar_t(或char),后者使用chtype诅咒。

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

如果基类型内部为chtype,这意味着ncurses对大多数unicode都不起作用,但事实并非如此 - 您可以在UTF-8源中使用硬编码字符串并使用属性no来写出来问题。它变得有趣的地方就是让它们重新回归。

wchar_t s[] = "\412";

此字符的值为266,显示为Ċ。但是,当使用例如chtype提取到mvwinchnstr()时,它与设置了COLOR_PAIR(1)属性(256)的空格(10)完全相同。事实上,如果您使用提取的chtype并重新显示它,那么您就会得到一个COLOR_PAIR(1)设置的空格。

但是,如果您将其提取到wchar_t中,例如mvwinnwstr(),这是正确的,有色空间也是如此。当然,问题在于属性已经消失。这意味着正确地掩盖了属性chtype明显不可能,因为chtype两者具有相同的值(266)。换句话说,内部表示显然不是chtype也不是wchar_t

我没有太多使用ncurses,我注意到还有其他的curses实现(例如Oracle's),其中的函数意味着chtype 可能没有这个问题。在任何情况下,有没有办法w / ncurses明确地提取宽字符及其属性?

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

1 个答案:

答案 0 :(得分:1)

比这更复杂。但简单地说:

  • 在SVr4实现中,只有chtype
  • X / Open工作标准化在多字节字符上添加,以cchar_t表示。
  • 在X / Open文档中并不明显,但在相应的Unix实现中看到,chtypecchar_t并未被设想为相同数据的不同视图。您只能 对前者进行8位编码。
  • 并没有多少应用程序真正深入研究Unix实现以使其显而易见(实际上,至少有一家供应商的XPG4实现从来没有足够好地进行有用的测试 - 对于最先进的技术来说是如此)。 LI>
  • 在ncurses中忽略了整合(或缺乏整合),这似乎很自然。
  • ncurses接受addstr中的多字节字符串(没有Unix的#)工作。
  • ncurses 尝试通过另一种通过另一种设置的界面提供相同的信息。
  • 有明显的限制:chtype对应于屏幕上的单个单元格,并且只能容纳8位字符。返回字符串的winnstr等接口将在该约束内工作。 winchnstr函数确实返回chtype值数组。
  • 如果您希望属性用于 8位字符的单元格,最好通过类似的win_wchnstr <检索它/ LI>