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

诅咒具有从屏幕上提取字符的各种功能;它们可以分为那些仅捕获文本的对象和那些捕获文本以及属性(粗体,颜色等)的对象。前者使用wchar_t(或char),而后者使用自己的chtype

有一些常量可以屏蔽chtype以获得字符或属性-A_CHARTEXTA_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++标记了出来,因为它在两种情况下都适用。]

最佳答案

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

  • 在SVr4实现中,只有chtype
  • X / Open标准化工作添加到多字节字符上,以cchar_t表示。
  • 在X / Open文档中不是很明显,但是在相应的Unix实现中可以看到,chtypecchar_t并未设想为相同数据的可能不同 View 。您只能使用前者进行8位编码。
  • 没有多少应用程序真正研究过Unix实现以使其变得明显(事实上,至少一个供应商的XPG4实现从未足够好地进行有用的测试-就现有技术而言是如此)。
  • 在ncurses中忽略了集成(或缺乏集成),这似乎很自然。
  • ncurses接受addstr中的多字节字符串(Unix均不这样做)。
  • ncurses尝试通过另一种设置的界面样式提供相同的信息。
  • 显然存在局限性:chtype对应于屏幕上的单个单元格,并且只能容纳8位字符。返回字符串的诸如 winnstr 之类的接口(interface)将在该约束内工作。 winchnstr 函数确实返回chtype值数组。
  • 如果您想要一个不是8位字符的单元格的属性,最好通过类似的 win_wchnstr
  • 检索它

    10-07 22:26