Windows控制台对Unicode有什么限制?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows控制台对Unicode有什么限制?相关的知识,希望对你有一定的参考价值。
可以使用WriteConsoleW
函数将Unicode字符写入Windows控制台。在我的Windows 7机器上,看起来控制台不支持Basic Multilingual Plane之外的字符。此外,组合字符显示在基本字符之后,而不是实际组合。
这些限制是否也出现在Windows的更高版本中? Windows控制台中的Unicode是否还有其他限制?
Windows控制台仅限于基本多语言平面
您到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的元素)。
我从其他答案中已经提到的限制开始:
- 每个单元格包含16位字符数据。换句话说:仅显示UCS-2代码点。 (特别是,对于BMP中的字符,使用代理字符显示其“分解为UCS-2”。)
- 仅支持简单的文本呈现。即使使用TTF字体,控制台也不会考虑字体的高级“功能”。无论是高级排版(连字等),还是组成字符组成字符或从右到左脚本(在LtR环境中)都不会按预期工作。 ¹⁾应用程序应重新排列字符以进行正确的双向渲染。
Font filtering
其他限制是由于控制台的字体过滤。一个字体必须非常特殊才能被控制台接受(在字体选择对话框中显示,这个选择“工作”¹⁾)。
¹⁾我不记得是否可以显示字体,但不能选择(我对这种情况的记忆模糊,但不能相信这种记忆)。
- 字体必须标记为等宽字体。由于应用程序的期望,²⁾这样的字体必须具有相同宽度的所有字形。 ⁾⁾后一种情况只有在想要使用控制台外的字体时才有意义。原则上,控制台不会检查字形的宽度。但是,每个字形都显示为具有“默认宽度”。在许多(所有?)情况下,只会显示“默认边界框”内的字形部分。我找不到任何规避这种限制的技巧。
- 在Windows的非EastAsian版本中,字体不能声称它支持4个东亚代码页中的任何一个.³ ⁾⁾请注意,这只是字体标题所声称的限制 - 标题中只有4位。字体可能包含这些语言的字形,并且它们会显示正常 - 只要字体不声明支持。有问题的代码页(在标题的OS /2⫽Charsets部分中)是932,936,949,950(JIS,简体中文,韩文Wansung,繁体中文)。
Bugs in font rendering
- 尽管Windows的控制台不支持
Underline
属性(DBCS codepages除外),但在计算屏幕上字符bbox的大小时,会考虑字体标题的“Underline position
”字段。这可能导致字体的意外纵横比,和/或预期“连接在一起”的字形之间的中断。 - 对于“不支持的字符”的替换字形,控制台非常挑剔。我无法找到如何使这样的字形与
U+0000
和/或U+0001
的字形存在共存。 (如果控制台在字体中找到后两个字形中的一个,则忽略替换字形。) - (这是一个非常模糊的错误;它需要非常技术性的讨论。)替换字形的另一个问题是字符
U+30FB
·(为什么?!)。如果字体中存在此字符,则此字符的字形将用作替换字形 - 但仅限于PUA中缺少的字符!
从本质上讲,就是这样!我没有发现任何其他限制。
以上是关于Windows控制台对Unicode有什么限制?的主要内容,如果未能解决你的问题,请参考以下文章
Unicode / UTF-8文本文件:Windows控制台上的乱码(试图显示希伯来语)