[请注意,我正在使用_XOPEN_SOURCE_EXTENDED 1
和setlocale(LC_CTYPE, "")
。]
诅咒具有从屏幕上提取字符的各种功能;它们可以分为那些仅捕获文本的对象和那些捕获文本以及属性(粗体,颜色等)的对象。前者使用wchar_t
(或char
),而后者使用自己的chtype
。
有一些常量可以屏蔽chtype
以获得字符或属性-A_CHARTEXT
和A_ATTRIBUTES
。但是,从这些值中,很容易看出wchar_t
值超过255会发生冲突。A_ATTRIBUTES
是64位,只有低8位未设置。
如果内部的基本类型是chtype
,这意味着ncurses无法使用大多数unicode,但事实并非如此-您可以在UTF-8源代码中使用硬编码的字符串,并使用属性将它们写出来没有问题。有趣的地方是让他们再次回来。
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
可能没有此问题。无论如何,有没有一种方法可以明确地提取宽字符及其属性?[我已经将此C和C++标记了出来,因为它在两种情况下都适用。]
最佳答案
比这更复杂。但简要地说:
chtype
。 cchar_t
表示。 chtype
和cchar_t
并未设想为相同数据的可能不同 View 。您只能使用前者进行8位编码。 addstr
中的多字节字符串(Unix均不这样做)。 chtype
对应于屏幕上的单个单元格,并且只能容纳8位字符。返回字符串的诸如 winnstr
之类的接口(interface)将在该约束内工作。 winchnstr
函数确实返回chtype
值数组。 win_wchnstr