可以使用WriteConsoleW
函数将Unicode字符写入Windows控制台。在我的Windows 7机器上,看起来控制台不支持Basic Multilingual Plane之外的字符。此外,组合字符显示在基本字符之后,而不是实际组合。
这些限制是否也出现在Windows的更高版本中? Windows控制台中的Unicode是否还有其他限制?
您到WriteConsole function的链接没有说明可用的控制台字符:
- lpBuffer [in]指向缓冲区的指针,该缓冲区包含要写入控制台屏幕缓冲区的字符。
但那个缓冲区是什么?简单的谷歌搜索writeconsole lpbuffer结构提供(间接)链接到CHAR_INFO structure:
语法(C ++)
typedef struct _CHAR_INFO { union { WCHAR UnicodeChar; CHAR AsciiChar; } Char; WORD Attributes; } CHAR_INFO, *PCHAR_INFO;
但WCHAR UnicodeChar
是什么?再次,一个简单的Google搜索windows wchar提供了Windows Data Types的链接:
WCHAR
一个16位的Unicode字符。有关更多信息,请参阅Character Sets Used By Fonts。这种类型在WinNT.h
中声明如下:typedef wchar_t WCHAR;
最后,上面的Character Sets Used By Fonts链接给出了下一个最终结果:Windows控制台仅限于基本多语言平面,即16位Unicode子集:
Unicode字符集
...为了解决多种编码方案的问题,开发了用于数据表示的Unicode标准。一种16位字符编码方案,Unicode可以代表65,536(2 ^ 16)个字符,足以包括当今计算机商务中的所有语言,以及标点符号,数学符号和扩展空间。 Unicode为每个字符建立唯一代码,以确保字符转换始终准确。
我在my answer to a different question写了部分答案;这里是一个完整披露的好地方。我的背景:我保持最有可能是最广泛的console font which fully supports Windows(它是Unifont的非常深刻的重写,添加了DejaVu的元素)。
我从其他答案中已经提到的限制开始:
其他限制是由于控制台的字体过滤。一个字体必须非常特殊才能被控制台接受(在字体选择对话框中显示,这个选择“工作”¹⁾)。
¹⁾我不记得是否可以显示字体,但不能选择(我对这种情况的记忆模糊,但不能相信这种记忆)。
Underline
属性(DBCS codepages除外),但在计算屏幕上字符bbox的大小时,会考虑字体标题的“Underline position
”字段。这可能导致字体的意外纵横比,和/或预期“连接在一起”的字形之间的中断。U+0000
和/或U+0001
的字形存在共存。 (如果控制台在字体中找到后两个字形中的一个,则忽略替换字形。)U+30FB
·(为什么?!)。如果字体中存在此字符,则此字符的字形将用作替换字形 - 但仅限于PUA中缺少的字符!从本质上讲,就是这样!我没有发现任何其他限制。