Raymond Chen 2007年05月16日
为什么控制台窗口仅限于Lucida Console和光栅字体?
在Windows 95中,我们尝试为控制台窗口使用其他字体,结果是一场灾难。
要成为控制台窗口的可用字体,该字体需要满足的条件不仅仅是等宽。它还需要支持OEM代码页中的所有字符。对于单字节字符集(SBCS)代码页来说,测试这一点很容易,因为它们只有256个字符。但对于双字节字符集(DBCS)代码页,测试所有字符意味着要测试数万个代码点。OEM代码页测试已经排除了很多字体,因为437代码页(美国默认)包含了一些奇特的字符,比如绘图字符和一些天文符号,这些字符大多数Windows字体都不会包含。
但检查字体是否支持所有必要的字符只是一个幌子。字体最终不适合用于控制台窗口的最常见原因是字体包含具有负A-或C宽度的字符。这些A-和C宽度值来自ABC
结构,表示字符消耗的下挂和上溢量。
以大写字母W为例。在许多字体中,该字符包含上溢和下挂:
注意左边和右边的笔画“超出”了假定的单元格边界。
我在Windows 95中编写了代码,允许在控制台窗口中使用任何等宽字体,而CD上的墨迹几乎还没干,错误就开始涌入。
“当我选择Courier New作为我的字体时,我的控制台窗口看起来像杰克逊·波洛克的画作,到处都是像素斑点,其他字符的部分被切断了。”(除了他们没有使用“像素斑点”这样礼貌的词汇。)
原因是那些上溢像素。控制台渲染模型假设每个字符都能整齐地适应其固定大小的单元格内。当一个新字符被写入单元格时,旧单元格会被新字符覆盖,但如果旧字符有上溢或下挂,那些额外的像素就会被留下,因为它们“溢出”了所需的单元格并影响了邻近单元格。同样,如果一个邻近的字符“溢出”了,那些“溢出像素”就会被擦除。
可以在控制台窗口中使用的字体集合被缩减到了那些经过测试并已知在控制台窗口中可以接受的字体。对于英语系统,这使我们只剩下Lucida Console和Terminal。
“为什么没有一个接口来选择替代字体,带有一个大而烦人的消息框警告你‘选择上面列表中的字体可能会导致非常丑陋的结果。不要怪我!’?”
首先,因为我们知道反正没有人会读那些警告。其次,因为字体选择不当会导致控制台窗口看起来如此丑陋,以至于每个人都会正确地声称这是一个错误。
“不,这不是一个错误。你自己选择了一个字体,当在控制台窗口中使用时会导致绘图伪影。”
“嗯,这很愚蠢。你应该阻止我选择一个在控制台窗口中使用会导致如此明显无意义的字体。”
我们所做的就是阻止用户选择明显会导致问题的字体。
当然,如果你是一个超级极客,并且愿意承担选择的字体可能不适用于控制台窗口的责任,你可以按照这篇知识库文章中的说明将你的字体添加到列表中。
但如果你最终创造了一件现代艺术作品,好吧,你自找的。
吹毛求疵的角落
在这篇文章的标题中,将控制台窗口替换为Windows控制台窗口。
†将Windows控制台窗口替换为在GUI窗口内显示的Windows控制台窗口,与已经进入硬件全屏的控制台完全是另一回事。