Windows 为什么';方特签名是什么字符集?

Windows 为什么';方特签名是什么字符集?,windows,fonts,gdi,uniscribe,Windows,Fonts,Gdi,Uniscribe,我列举的Windows字体如下: LOGFONTW lf = {0}; lf.lfCharSet = DEFAULT_CHARSET; lf.lfFaceName[0] = L'\0'; lf.lfPitchAndFamily = 0; ::EnumFontFamiliesEx(hdc, &lf, reinterpret_cast<FONTENUMPROCW>(FontEnumCallback),

我列举的Windows字体如下:

LOGFONTW lf = {0};
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfFaceName[0] = L'\0';
lf.lfPitchAndFamily = 0;
::EnumFontFamiliesEx(hdc, &lf,
                     reinterpret_cast<FONTENUMPROCW>(FontEnumCallback),
                     reinterpret_cast<LPARAM>(this), 0);
对于TrueType字体,我通常会多次获取每个面名称。例如,对于多个调用,我将得到
pelf->elfFullName
pelf->elfLogFont.lfFaceName
设置为
“Arial”
。仔细查看其他字段,我发现每个调用都针对不同的脚本。例如,在第一次调用时,
pelf->elfScript
将是
“Western”
pelf->eldlogfont.lfCharSet
将是
ANSI\u CHARSET
的数字等价物。在第二次通话中,我得到了
“希伯来语”
希伯来语\u字符集
。第三次呼叫
“阿拉伯语”
阿拉伯语字符集
。等等到目前为止,一切顺利

但是所有版本的Arial的(
pMetrics->ntmFontSig
)字段是相同的。事实上,字体签名声称所有这些版本的Arial都支持拉丁语-1、希伯来语、阿拉伯语和其他语言

我知道我试图绘制的字符串的字符集,所以我试图根据字体签名实例化一种合适的字体。因为字体签名总是匹配的,所以我总是选择“Western”字体,即使在显示希伯来文或阿拉伯文文本时也是如此。我使用的是低级Uniscribe API,所以我没有得到Windows字体链接的好处,但我的代码似乎可以工作

lfCharSet
是否真的有任何意义,或者它是一个遗留工件?我是否应该将
lfCharSet
设置为
DEFAULT\u CHARSET
并停止担心每个面的所有脚本变化


就我而言,我只关心TrueType和OpenType字体。

我想我找到了答案。多次枚举的字体是。大字体是包含多个脚本或代码页的字形的单一字体

fsUsb
)的Unicode部分表示字体可以处理的所有Unicode子范围。这与字符集无关。如果使用宽字符API,则无论创建字体时指定了哪个字符集,都可以使用字体中包含的所有字形

FONTSIGNATURE
fsCsb
)的代码页部分表示字体可以处理的代码页。我认为这只有在字体不是“大”字体时才有意义。在这种情况下,
fsUsb
掩码将全部为零,
fsCsb
将指定适当的字符集。在这些情况下,重要的是在
LOGFONT
中获得正确的
lfCharSet


当实例化“大”字体并使用宽字符API时,您指定哪个
lfCharSet
显然无关紧要。

我想我找到了答案。多次枚举的字体是。大字体是包含多个脚本或代码页的字形的单一字体

fsUsb
)的Unicode部分表示字体可以处理的所有Unicode子范围。这与字符集无关。如果使用宽字符API,则无论创建字体时指定了哪个字符集,都可以使用字体中包含的所有字形

FONTSIGNATURE
fsCsb
)的代码页部分表示字体可以处理的代码页。我认为这只有在字体不是“大”字体时才有意义。在这种情况下,
fsUsb
掩码将全部为零,
fsCsb
将指定适当的字符集。在这些情况下,重要的是在
LOGFONT
中获得正确的
lfCharSet

当实例化“大”字体并使用宽字符API时,您指定哪个
lfCharSet
显然无关紧要

int CALLBACK FontEnumerator::FontEnumCallback(const ENUMLOGFONTEX *pelf,
                                              const NEWTEXTMETRICEX *pMetrics,
                                              DWORD font_type,
                                              LPARAM context);