Calibri
字体没有任何一个字符,0x062A
和 0x660E
,但第一个字符使用其他字符打印字体。但是,字符 0x660E
显示为无效字符代码。为什么 TextOut()
不替换字体来打印最后一个字符,就像它对字符代码 0x062A
所做的一样?
如果我用 Arial
替换 Calibri
字体,结果是一样的。
编辑:另外我想提醒您注意这句话,可以在这里找到 http://msdn.microsoft.com/en-us/goglobal/bb688134.aspx :“Windows 核心字体(Times New Roman、Courier New、Arial、Microsoft Sans Serif 和 Tahoma)包含拉丁文、希伯来文、阿拉伯文、希腊文和西里尔文脚本,但不包含东亚脚本字符。它们链接到做...
输出的屏幕截图 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
static HFONT s_hFont;
switch( message )
{
case WM_CREATE:
{
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = -MulDiv(20, 96, 72);
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
wcscpy_s(lf.lfFaceName, LF_FACESIZE, L"Calibri");
if( !(s_hFont = CreateFontIndirect(&lf)) ) return -1;
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
s_hFont = (HFONT)SelectObject(ps.hdc, s_hFont);
wchar_t wchar1 = 0x062A; // Arabic character
TextOut(ps.hdc, 10, 10, &wchar1, 1);
wchar_t wchar2 = 0x660E; // Japanese character
TextOut(ps.hdc, 10, 50, &wchar2, 1);
s_hFont = (HFONT)SelectObject(ps.hdc, s_hFont);
EndPaint(hwnd, &ps);
}
break;
case WM_DESTROY:
DeleteObject(s_hFont);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0L ;
}
最佳答案
我怀疑你会得到一个很好的答案,因为字体链接没有很好的记录,也没有人真正关心它(原因我会解释)。
Michael Kaplan 写了一系列关于该主题的简短文章:字体替换和链接部分 1 , 2和 3 .还有一个 MSDN article .
正如 Michael Kaplan 指出的那样,字体链接取决于当前系统区域设置,也可以在任何系统上进行编辑。你不能依赖它。
因此任何关心处理多语言文本的应用程序都将使用 MLang或 Uniscribe或其他一些库以确保获得良好的结果。
大多数应用程序不需要这种级别的国际支持。处理用户自己的脚本通常就足够了,Windows 大多会为您完成这些工作。例如,我的日语用户想要输入日语文本;他们不在乎乌尔都语是否不能在他们的计算机上运行。巴基斯坦用户反之亦然。
总而言之,如果您不关心支持用户脚本以外的内容,请使用 Windows 默认设置。如果您确实在意,请使用库来输出文本。不要依赖字体链接。
关于c++ - 为什么用 `0x62A`字体打印字符 "Calibri",而字符 `0x660E`不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267545/