[请注意我使用_XOPEN_SOURCE_EXTENDED 1
和setlocale(LC_CTYPE, "")
。]
Curses包括从屏幕中提取字符的各种功能;它们可以分为仅抓取文本的那些以及抓取文本和属性(粗体,颜色等)的那些。前者使用wchar_t
(或char
),后者使用chtype
诅咒。
有一些常量可以屏蔽chtype
以仅获取字符或仅获取属性 - A_CHARTEXT
和A_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 ++,因为它适用于两种情况。]
答案 0 :(得分:1)
比这更复杂。但简单地说:
chtype
。cchar_t
表示。chtype
和cchar_t
并未被设想为相同数据的不同视图。您只能 对前者进行8位编码。addstr
中的多字节字符串(没有Unix的#)工作。chtype
对应于屏幕上的单个单元格,并且只能容纳8位字符。返回字符串的winnstr
等接口将在该约束内工作。 winchnstr
函数确实返回chtype
值数组。win_wchnstr
<检索它/ LI>