我正在尝试从 Wingdings 字体显示 Unicode 字符(它是仅支持符号字符集的 Unicode TrueType 字体)。它使用相应的区域操作系统设置在我的 Win7/64 系统上正确显示:
- 格式:俄语
- 地点:俄罗斯
- 系统区域设置(非 Unicode 应用程序的 AKA 语言):英语
但是,如果我将系统区域设置切换为俄语,则代码 > 127 的 Unicode 字符显示不正确(替换为框)。
我的应用程序是在 Visual Studio 中使用 Unicode Charset 创建的,它只调用 Unicode Windows API 函数。
我还注意到,一些 Windows 应用程序也使用符号字体(符号、Wingdings、Webdings 等)错误地显示此类字符,例如记事本、Beyond Compare 3。但写字板和 MS Office 应用程序不受影响。
这是最小的代码片段(为简洁起见跳过了资源清理):
LOGFONTW lf = { 0 };
lf.lfCharSet = SYMBOL_CHARSET;
lf.lfHeight = 50;
wcscpy_s(lf.lfFaceName, L"Wingdings");
HFONT f = CreateFontIndirectW(&lf);
SelectObject(hdc, f);
// First two chars displayed OK, 3rd and 4th aren't (replaced with boxes) if
// Non-Unicode apps language is NOT English.
TextOutW(hdc, 10, 10, L"\x7d\x7e\x81\xfc");
所以问题是:为什么非 Unicode 应用程序的语言设置会影响 Unicode 应用程序?
SYMBOL_CHARSET
在不依赖于操作系统系统区域设置的情况下,显示字体的正确(也是最简单)方法是什么?