Windows 控制台对 Unicode 有哪些限制?

use*_*783 2 windows unicode console cmd

可以使用该WriteConsoleW函数将 Unicode 字符写入 Windows 控制台。在我的 Windows 7 机器上,控制台似乎不支持基本多语言平面之外的字符。此外,组合字符显示在基本字符之后,而不是实际组合。

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

Ily*_*ich 5

我在另一个问题的回答中写了部分答案;这里是全面披露的好地方。我的背景:我维护的很可能是完全支持 Windows的最广泛的控制台字体(这是对Unifont的非常深入的重写,添加了DejaVu 的元素)。

我从其他答案中已经提到的限制开始:

  • 每个单元格包含 16 位字符数据。换句话说:仅显示 UCS-2 代码点。(特别是,对于 BMP 之外的字符,使用代理字符显示其“分解为 UCS-2”。)

  • 仅支持简单的文本呈现。即使使用 TTF 字体,控制台也不会考虑该字体的高级“功能”。既没有先进的排版(连字等),也没有为组成字符或从右到左的脚本组成字形¹?(在 LtR 环境中)会按预期工作。

        ¹? 应用程序应该重新排列字符以进行正确的双向渲染。

字体过滤

其他限制是由于控制台的字体过滤。字体必须非常特殊才能被控制台接受(显示在字体选择对话框中,并且这个选择“工作”¹?)。

    ¹? 我不记得是否可以显示字体,但不能选择(我对这种情况有模糊的记忆,但不能相信这个记忆)。

  • 字体必须标记为等宽。由于对应用程序的期望,²?此类字体必须具有相同宽度的所有字形。

        ²?后一种情况只有在想要在控制台之外使用字体时才相关。原则上,控制台不会检查字形的宽度。但是,每个字形都显示为具有“默认宽度”。在许多(所有?)情况下,只会显示“默认边界框”内的字形部分。我找不到任何技巧来规避这个限制。

  • 在非东亚版本的 Windows 上,该字体不能声称它支持 4 个东亚代码页中的任何一个。³?

        ³?请注意,这只是字体标题声称的限制? -?标题中仅存在 4 位。字体可能存在这些语言的字形,并且它们会显示得很好?-?只要字体不要求支持。有问题的代码页(在 OS/2?Charsets 部分)是 932、936、949、950(JIS、简体中文、韩文 Wansung、繁体中文)。

字体渲染中的错误

  • 尽管 Windows 的控制台不支持Underline属性(DBCS 代码页除外),Underline position但在计算屏幕字符 bbox 的大小时会考虑字体标题的“ ”字段。这可能会导致字体出现意外的纵横比,和/或预期“连接在一起”的字形之间的中断。

  • 控制台对“不支持的字符”的替换字形非常挑剔。我找不到如何使这样的字形与U+0000和/或的字形共存U+0001。(如果控制台在字体中找到后两个字形之一,它会忽略替换字形。)

  • (这是一个非常模糊的错误;它需要非常技术性的讨论。)替换字形的另一个问题是字符U+30FB? (为什么?!)。如果字体中存在此字符,则此字符的字形将用作替换字形?—?但仅用于 PUA 中缺少的字符!

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