当前位置: 首页 > 知识库问答 >
问题:

为什么'0x62a'字符印有“Calibri”字体,而'0x660e'字符却不印有“Calibri”字体?

仇炜
2023-03-14

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)包含拉丁文、希伯来文、阿拉伯文、希腊文和西里尔文脚本,但不包含东亚脚本字符。它们链接到包含东亚脚本字符的字体。”好吧,我用所有这些字体尝试了我的代码,结果完全一样:字符0x660E被呈现为无效。

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 ;
}

输出中的屏幕快照

共有1个答案

郭盛
2023-03-14

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

Michael Kaplan就这个主题写了一个简短的系列文章:字体替换和链接第1、2和3部分。还有一篇MSDN的文章。

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

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

大多数应用程序不需要这种级别的国际支持。处理用户自己的脚本通常就足够了,Windows主要为您做这件事。比如我的日本用户想输入日文文本;他们不在乎乌尔都语在他们的电脑上不起作用。巴基斯坦的用户也是如此。

总而言之,如果您不关心支持用户脚本以外的内容,那么就使用Windows默认值。如果你真的关心,使用一个库来输出你的文本。不要依赖字体链接。

 类似资料:
  • 问题内容: 我有以下课程: 这是编译结果; 为什么我的输出中包含数字? 问题答案: 在第二种情况下,它将两个字符(G-71和o-111)的unicode码相加并打印总和。这是因为被视为数字类型,因此在这种情况下,运算符是通常的求和。

  • #include <stdio.h> #include <wchar.h> int main(void) { char str1[] = "abcd"; wchar_t str2[] = L"abcd"; return 0; } 技巧 用gdb调试程序时,可以使用“x/s”命令打印ASCII字符串。以上面程序为例: Temporary brea

  • 我想我需要删除字符0-31和127。 是否有一个函数或一段代码来高效地做到这一点?

  • 问题内容: 为什么此字体在IE8中呈现: 而且这不是: 我真的不知道。所有其他浏览器都可以正常工作。 问题答案: 尝试使用在线woff / ttf / svg转eot转换器与其他文件之一创建一个新文件。 <-可能会出现问题,因为它们将字体名称列入黑名单。 如果此新文件不起作用,则可能是字体本身存在问题。如果实际字体文件中的“字体名称”和“家族名称”不同,则有时IE6-8会适合。要解决这个问题: 您

  • 问题内容: 我正在使用一个返回字节字符串的库,我需要将其转换为字符串。 尽管我不确定有什么区别-如果有的话。 问题答案: 假设使用Python 3(在Python 2中,这种区别的定义不太明确)-字符串是字符序列,即unicode码点;这些是一个抽象概念,不能直接存储在磁盘上。毫无疑问,字节字符串是字节的序列- 可以 存储在磁盘上的东西。它们之间的映射是一种 编码 -其中有很多(并且无限可能)-并

  • 问题内容: 我所知道的打印,我们可以使用,并且我们可以使用 ,但我们仍然可以使用打印它们。那么,如果我总是习惯于打印它们怎么办?如果我这样做会发生什么问题? 问题答案: 不会有什么不好的,但是动词指示软件包打印为数字(以10为底),动词表示使用可以覆盖的 默认 格式。 请参阅以下示例: 输出(在Go Playground上尝试): 使用动词时,程序包将检查该值是否实现接口(这是一个方法),如果是,