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

时间:2016-06-17 05:52:09

标签: windows unicode cmd console

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

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

2 个答案:

答案 0 :(得分: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为每个字符建立唯一的代码以确保这一点   字符翻译总是准确的。

答案 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中缺少的字符!

基本上就是这样!我没有发现任何其他限制。