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

sas*_*alm 1 c++ unicode fonts mfc windows-xp

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

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

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

Adr*_*thy 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如何做到这一点.

这里有几个花絮:

Font Linking和Font Fallback的定义:http: //msdn.microsoft.com/en-us/goglobal/bb688163

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

Uniscribe文档: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