Windows控制台对Unicode有什么限制?

问题描述 投票:1回答:2

可以使用WriteConsoleW函数将Unicode字符写入Windows控制台。在我的Windows 7机器上,看起来控制台不支持Basic Multilingual Plane之外的字符。此外,组合字符显示在基本字符之后,而不是实际组合。

这些限制是否也出现在Windows的更高版本中? Windows控制台中的Unicode是否还有其他限制?

windows unicode cmd console
2个回答
3
投票

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为每个字符建立唯一代码,以确保字符转换始终准确。


3
投票

我在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中缺少的字符!

从本质上讲,就是这样!我没有发现任何其他限制。

© www.soinside.com 2019 - 2024. All rights reserved.