3

フォントには と のどちらの文字もありCalibriませんが、最初の文字は他のフォントを使用して印刷されます。ただし、文字は無効な文字コードとして表示されます。文字コードで行ったのと同じように、この最後の文字を印刷するためにフォントを置き換えないのはなぜですか?0x062A0x660E0x660ETextOut()0x062A

Calibriフォントを に置き換えてもArial、結果は同じです。

編集 : また、この文に注意を向けたいと思います。この文は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 ;
}

出力のスクリーンショット

ここに画像の説明を入力

4

2 に答える 2

3

フォントのリンクは十分に文書化されておらず、誰も本当に気にしていないため、非常に良い答えが得られるとは思えません (理由については後で説明します)。

Michael Kaplan は、この主題に関する一連の短い記事を書きました: フォントの置換とリンク部分12、および3。そして、MSDN の記事があります。

Michael Kaplan が指摘しているように、フォントのリンクは現在のシステム ロケールに依存し、任意のシステムで編集することもできます。あなたはそれに頼ることはできません。

したがって、多言語テキストの処理に関心のあるアプリケーションは、MLangUniscribeなどのライブラリを使用して、良好な結果を保証します。

ほとんどのアプリケーションは、このレベルの国際サポートを必要としません。通常、ユーザー独自のスクリプトを処理するだけで十分であり、ほとんどの場合、Windows がこれを行います。たとえば、私の日本人ユーザーは日本語のテキストを入力したいと考えています。コンピューターでウルドゥー語が動作しなくても気にしません。パキスタンのユーザーはその逆です。

要約すると、ユーザーのスクリプト以外をサポートすることに関心がない場合は、Windows の既定値を使用してください。気にする場合は、テキスト出力にライブラリを使用してください。フォントのリンクに依存しないでください。

于 2012-07-01T20:04:00.817 に答える