c++ - 为什么用 `0x62A`字体打印字符 "Calibri",而字符 `0x660E`不是?

标签 c++ winapi fonts

Calibri 字体没有任何一个字符,0x062A0x660E,但第一个字符使用其他字符打印字体。但是,字符 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 ;
}

输出的屏幕截图

enter image description here

最佳答案

我怀疑你会得到一个很好的答案,因为字体链接没有很好的记录,也没有人真正关心它(原因我会解释)。

Michael Kaplan 写了一系列关于该主题的简短文章:字体替换和链接部分 1 , 23 .还有一个 MSDN article .

正如 Michael Kaplan 指出的那样,字体链接取决于当前系统区域设置,也可以在任何系统上进行编辑。你不能依赖它。

因此任何关心处理多语言文本的应用程序都将使用 MLangUniscribe或其他一些库以确保获得良好的结果。

大多数应用程序不需要这种级别的国际支持。处理用户自己的脚本通常就足够了,Windows 大多会为您完成这些工作。例如,我的日语用户想要输入日语文本;他们不在乎乌尔都语是否不能在他们的计算机上运行。巴基斯坦用户反之亦然。

总而言之,如果您不关心支持用户脚本以外的内容,请使用 Windows 默认设置。如果您确实在意,请使用库来输出文本。不要依赖字体链接。

关于c++ - 为什么用 `0x62A`字体打印字符 "Calibri",而字符 `0x660E`不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267545/

相关文章:

c++ - boost::adaptor::filtered core dumps with boost::range_detail::default_constructible_unary_fn_wrapper "Assertion ` m_impl' 失败”

c++ - 我的类型在 std 函数中未能通过 enable_if 谓词。有没有办法 "debug"谓词?

c++ - 我的程序的 exe 文件所需的 DLL

c++ - 为什么我不能在 Win32 中启用 unicode Edit 控件?

c# - 在另一个应用程序中操作滚动条窗口

javascript - 根据输入值设置字体颜色

c++ - 用 STL 维护最小堆的简单方法?

c++ - 在结构中使用结构数组时在标量初始值设定项周围加括号

java - 按钮和 ActionBar 忽略应用程序中定义的自定义字体

python - 使用脚本取消设置 PDF 字体