在 ncurses 中提取带有属性的宽字符
Extracting wide chars w/ attributes in ncurses
[请注意我使用的是 _XOPEN_SOURCE_EXTENDED 1
和 setlocale(LC_CTYPE, "")
。]
Curses 包括从屏幕中提取字符的各种函数;它们可以分为只抓取文本的和抓取文本加上属性(粗体、颜色等)的。前者使用wchar_t
(或char
),后者诅咒自己的chtype
.
有一些常量可以屏蔽 chtype
以仅获取字符或属性 -- A_CHARTEXT
和 A_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 实现中看到,
chtype
和 cchar_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
[请注意我使用的是 _XOPEN_SOURCE_EXTENDED 1
和 setlocale(LC_CTYPE, "")
。]
Curses 包括从屏幕中提取字符的各种函数;它们可以分为只抓取文本的和抓取文本加上属性(粗体、颜色等)的。前者使用wchar_t
(或char
),后者诅咒自己的chtype
.
有一些常量可以屏蔽 chtype
以仅获取字符或属性 -- A_CHARTEXT
和 A_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 实现中看到,
chtype
和cchar_t
并未被设想为同一数据的可能不同视图。您只能使用前者进行 8 位编码。 - 没有多少应用程序真正深入研究 Unix 实现以使其显而易见(事实上,至少有一个供应商的 XPG4 实现从来没有足够好地进行有用的测试——对于最先进的技术来说就这么多)。
- 在 ncurses 中忽略了集成(或缺少集成),这似乎是很自然的事情。
- ncurses 接受
addstr
中的多字节字符串(Unix 的 none)。 - ncurses 尝试通过另一种设置的界面样式提供相同的信息。
- 明显有局限性:
chtype
对应屏幕上的单个单元格,只能容纳一个8位字符。winnstr
which return a string will work within that constraint. Thewinchnstr
函数等接口执行 returnchtype
个值的数组。 - 如果您想要属性 不是 8 位字符的单元格,最好通过以下方式检索它类似的
win_wchnstr