MS Sans Serif无法在XP中显示Unicode文本,但可以在Win7中显示

时间:2012-02-28 16:16:40

标签: c++ unicode mfc fonts windows-xp

我有一个在Win7中显示阿拉伯语/西里尔语/中文的Unicode项目,但是当我将同一个exe文件复制到一个全新安装的XP SP3的虚拟机时,它会显示黑色矩形。

同时我有一个所有者绘制的控件,显示它们很好。我在其中使用Arial字体。默认MFC控件似乎使用MS Sans Serif。当我将所有者绘制的控件更改为使用MS Sans Serif时,它也开始显示黑色矩形。

所以我认为问题出在XP中的MS Sans Serif上。 MS Sans Serif可以在XP中显示Unicode吗?

4 个答案:

答案 0 :(得分:8)

在Windows上,很少有字体具有足够广泛的字符库以表示所有阿拉伯语,西里尔语和中文。我所知道的那些默认情况下不附带Windows。

相反,大多数用于绘制文本的Windows API将根据覆盖范围的需要自动切换字体。例如,您可能在Tahoma中绘制了一个字符串,其中包含一些中文字符。 Windows将自动从Tahoma切换为具有中文字符的字体。这就产生了一种具有巨大字符曲目的字体的错觉。

如果您选择的字体是主要的TrueType或OpenType字体之一,Windows会自动执行此操作。如果你选择了一个晦涩的字体或位图字体,它就不会。正如另一个答案所指出的,MS Sans Serif是一种位图字体。 Microsoft Sans Serif是一种TrueType字体。

此外,对于这种字体链接和后备工作,它需要有一些字体可以回退。例如,如果您没有任何带有中文字符的字体,那么您将获得占位符框而不是中文。较新版本的Windows(如Windows 7)具有大量可用的后备字体。较早版本的Windows(如XP)提供了特定于区域的版本,这些版本仅包含该区域的字体。如果你有“美国”安装Windows XP,您可能需要进入控制面板并告诉它您需要多语言支持,这将为中文,阿拉伯语等加载字体和表格。

更新:Mark Ransom要求提供文档链接。我没有在一个地方找到一个描述字体链接和字体回退细节的地方。据我所知,我从各种来源收集过,比如MSDN博客(特别是Michael Kaplan和Raymond Chen)和Uniscribe文档。由于项目具有极其不寻常的约束,我必须实现自己的字体链接和后备。在这个过程中,我学到了很多关于Windows如何做到的事情。

以下是一些花絮:

字体链接和字体后退的定义:http://msdn.microsoft.com/en-us/goglobal/bb688163

澄清它们之间的差异:http://www.siao2.com/2005/10/01/476022.aspx

取消订阅文档:http://msdn.microsoft.com/en-us/library/windows/desktop/dd374091(v=vs.85).aspx

有关字体回退的一些细节:http://msdn.microsoft.com/en-us/library/windows/desktop/dd374105(v=vs.85).aspx

Michael Kaplan关于字体替换和字体链接的博文从这里开始:http://www.siao2.com/2005/03/20/399322.aspx

您可以从IE提供的旧MLang API中了解一下字体链接:http://msdn.microsoft.com/en-us/library/ie/aa767872(v=vs.85).aspx

答案 1 :(得分:2)

Microsoft建议使用“MS Shell Dlg”或“MS Shell Dlg 2”作为对话框和控件中的指定字体。这是一个逻辑字体名称,将替换为适合您PC的物理字体。

请参阅此TechNet文章Using MS Shell Dlg and MS Shell Dlg 2

答案 2 :(得分:1)

在我的Windows 7 Pro上,MS Sans Serif似乎只包含ISO Latin 1字符 - 甚至不包括windows-1252字符,如en dash“ - ”。这仅仅是基于字体设置为MS Sans Serif时查看字符映射。所以我不希望XP让MS Sans Serif拥有更广泛的角色曲目。

请注意,“MS Sans Serif”是一种非常有限的位图(光栅)字体,与“Microsoft Sans Serif”完全不同,后者是一种具有相当好的字符覆盖率的矢量字体。当请求“MS Sans Serif”时,某些程序可能会自动切换到它。在Word 2007中,我甚至看不到“MS Sans Serif”。在IE 9上(但不在Firefox上),如果我在CSS中指定font-family: MS Sans Serif,我会得到“Microsoft Sans Serif”。​​

答案 3 :(得分:0)

如果您需要使用xp sp3,则不得将这些字形安装在xp sp3附带的默认字体中,您必须安装更新的字体包。