可以使用WriteConsoleW
功能将Unicode字符写入Windows控制台。在我的Windows 7机器上,看起来控制台不支持Basic Multilingual Plane之外的字符。此外,组合字符显示在基本字符之后,而不是实际组合。
这些限制是否也出现在Windows的更高版本中?在Windows控制台中对Unicode有其他限制吗?
答案 0 :(得分:3)
您指向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为每个字符建立唯一的代码以确保这一点 字符翻译总是准确的。
答案 1 :(得分:3)
我在my answer to a different question写了部分答案;这里是一个完整披露的好地方。我的背景:我尽可能保持最广泛的console font which fully supports Windows(这是Unifont的非常深刻的重写,添加了DejaVu元素。
我从其他答案中已经提到的限制开始:
每个单元格包含16位字符数据。换句话说:仅显示UCS-2代码点。 (特别是,对于BMP中的字符,使用代理字符显示其“分解为UCS-2”。)
仅支持简单文本呈现。即使使用TTF字体,控制台也不会考虑字体的高级“功能”。无论是高级排版(连字等),还是组成字符组成字符或从右到左脚本(在LtR环境中)都不会按预期工作。
¹⁾应用程序应重新排列字符以进行正确的双向渲染。
其他限制是由控制台进行字体过滤造成的。一个字体必须非常特殊才能被控制台接受(在字体选择对话框中显示,这个选择“工作”¹⁾)。
¹⁾我不记得是否可以显示字体,但不能选择(我对这种情况的记忆模糊,但不能相信这种记忆)。
字体必须标记为等宽字体。由于应用程序的期望,²⁾这样的字体必须具有相同宽度的所有字形。
²⁾只有在想要使用控制台外的字体时,后一种情况才有意义。原则上,控制台不会检查字形的宽度。但是,每个字形都显示为具有“默认宽度”。在许多(所有?)情况下,只会显示“默认边界框”内的字形部分。我找不到任何规避这种限制的技巧。
在Windows的非EastAsian版本中,字体不能 声明 它支持4个东亚代码页中的任何一个.³⁾
³⁾请注意,这只是字体标题声明的限制 - 标题中只有4位。字体可能包含这些语言的字形,并且它们会显示正常 - 只要字体不声明支持。有问题的代码页(在标题的OS /2⫽Charsets部分中)是932,936,949,950(JIS,简体中文,韩文Wansung,繁体中文)。
虽然Windows的控制台不支持Underline
属性(DBCS codepages除外),但是当字体大小为“Underline position
”时,会考虑字体标题的“U+0000
”字段。计算屏幕上的字符bbox。这可能会导致字体意外的宽高比,和/或预期“连接在一起”的字形之间的中断。
控制台对“不支持的字符”的替换字形非常挑剔。我找不到如何使这样的字形与U+0001
和/或U+30FB
的字形共存。 (如果控制台在字体中找到后两个字形中的一个,则忽略替换字形。)
(这是一个非常模糊的错误;它需要非常技术性的讨论。)替换字形的另一个问题是字符{{1}}·(为什么?!)。如果字体中出现此字符,则此字符的字形将用作替换字形 - 但仅限于PUA中缺少的字符!
基本上就是这样!我没有发现任何其他限制。