Unicodeの0x2F00〜0x2FFFの描画について

[戻る]
ぴょぴょ 2010/12/10(金) 01:37:30
以前から Unicode 文字の描画ができません。
Unicode 文字の 0x2F00 〜 0x2FFF は漢字です。
描画すると「・」という文字が描かれます。

しかし 0x2600 〜 0x266F の絵文字は描かれますが、
0x2670 〜 0x267D の絵文字は描画されません。
なお、0x267E 〜 0x26FF は文字が割り当ててないため「・」と描画されます。

[質問]
どのようにしたら全ての Unicode 文字をクライアント領域に描画できるのでしょうか?
今は「MS ゴシック」フォントを使ってます。
これが原因なのでしょうか。
こちらでは、もう分かりません。
お願いします。

ぴょぴょ 2010/12/10(金) 01:37:45
参考のためにソースを載せます。

// フォント・オブジェクトの作成
HFONT funcCreateFont( LONG nWidth, LONG nHeight, LONG nWeight, BOOL bItalic, 
BOOL bUnderLine, BOOL bStrike, LPCTSTR lpFontName )
{
    return CreateFont(
        nHeight,                        // フォントの高さ
        nWidth,                         // フォントの文字幅
        0,                              // 文字送り方向の角度
        0,                              // ベースラインの角度
        nWeight,                        // フォントの太さ
        bItalic,                        // 斜体
        bUnderLine,                     // 下線
        bStrike,                        // 取り消し線
        SHIFTJIS_CHARSET,               // 文字セット
        OUT_DEFAULT_PRECIS,             // 出力精度
        CLIP_DEFAULT_PRECIS,            // クリッピング精度
        DEFAULT_QUALITY,                // 出力品質
        (FIXED_PITCH|FF_DONTCARE),      // ピッチとファミリー
        lpFontName );                   // フォント名
}

// Unicode 文字の描画
VOID funcDrawUnicode( HDC hDC, LONG nCode )
{
    TCHAR szBuff[ 4 ] = { 0 };
    
    for ( LONG yy = 0 ; yy < 16 ; yy++ ){
        for ( LONG xx = 0 ; xx < 16 ; xx++, nCode++ ){
            LONG dot = 48;
            LONG cx = (xx * dot);
            LONG cy = (yy * dot);
            RECT rc;
            
            szBuff[ 0 ] = (TCHAR)nCode;
            SetRect( &rc, 0, 0, dot, dot );
            OffsetRect( &rc, cx, cy );
            DrawText( hDC, szBuff, -1, &rc, (DT_CENTER | DT_VCENTER | 
DT_SINGLELINE) );
        }
    }
}

case WM_PAINT:
{
    PAINTSTRUCT     ps;
    HDC             hDC;
    HFONT           hNewFont;
    HFONT           hOldFont;
    
    hDC         = BeginPaint( hWnd, &ps );
    hNewFont    = (HFONT)funcCreateFont( 0, 40, FW_NORMAL, 0, 0, 0, TEXT("MS 
ゴシック") );
    hOldFont    = (HFONT)SelectObject( hDC, hNewFont );
    SetBkMode( hDC, TRANSPARENT );
    funcDrawUnicode( hDC, 0x2600 );
    SelectObject( hDC, hOldFont );
    DeleteObject( hNewFont );
    EndPaint( hWnd, &ps );
    break;
}

YuO [E-Mail] 2010/12/10(金) 03:36:21
単純にフォントにグリフが用意されていないだけでしょう。
GetFontUnicodeRanges APIでどの文字が描画可能かを知ることができます。
http://msdn.microsoft.com/en-us/library/dd144887.aspx


手元のMS ゴシック (Windows Vista) をATOK 文字パレットで表示させたところ,

・Kangxi Radicals (U+2F00 - U+2FDF, 割り当てはU+2F00 - U+2FD5) <康煕部首>
用意されているのはU+2F33 KANGXI RADICAL SHORT THREADのみ
・Ideographic Description Characters (U+2FF0 - U+2FFF,割り当てはU+2FF0 - U
+2FFB) <漢字構成記述文字>
全部用意されている
・Miscellaneous Symbols (U+2600 - U+26FF) <その他の記号>
U+2614 UMBRELLA WITH RAIN DROPS
U+2615 HOT BEVERAGE
U+2618 SHAMROCK
U+2619 REVERSED ROTATED FLORAL HEART BULLET
U+2670 WEST SYRIAC CROSS - U+26FF WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
が用意されていない

となりました。
# <>内はATOK 文字パレットでの名称


なお,Kangxi Radicalsの範囲であれば,メイリオですべて表示可能です。
また,Miscellaneous Symbolsの範囲においてメイリオでは,U+2672 UNIVERSAL 
RECYCLING SYMBOL - U+267D PARTIALLY-RECYCLED PAPER SYMBOLが追加されています。
# 上記の範囲名や実際に文字が割り当てられている範囲はUnicode 6.0.0を基にしていま
す。

ぴょぴょ 2010/12/10(金) 14:23:29
YuOさん。
ありがとうございます。

> 単純にフォントにグリフが用意されていないだけでしょう。
フォントを TEXT("Meiryo") にしたらほとんどの Unicode 文字が描画できました。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%AA%E3%82%AA

Unicode.html
↓
-------------
<FONT SIZE=7>
&#x2670;
&#x2671;
&#x2672;
&#x2673;
&#x2674;
&#x2675;
&#x2676;
&#x2677;
&#x2678;
&#x2679;
&#x267A;
&#x267B;
&#x267C;
&#x267D;
&#x267E;
&#x267F;
</FONT>
-------------
上記の Unicode.html をブラウザで見ると 0x2670、0x2671 が十字のような絵文字で表
示されます。
しかし、やはりすべては描画されてない様子です。
つまり、プログラムでは 0x2670、0x2671 コードが「・」に描画されます。
IE8.0では、どのように Unicode 文字を表示してるのでしょうか。
分かりますか。

YuO [E-Mail] 2010/12/10(金) 14:40:32
http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=2670
で表示させた文字をOneNoteに送ると,フォントはEstrangelo Edessaとなっていました。

次に,IEの設定を調べると,古代シリア語がEstrangelo Edessaに対応していました。
ATOK 文字パレットでは周辺ではU+2670, U+2671にのみグリフが存在します。
確かにSYRIACなのでシリア語フォント選ぶのは間違ってはいませんが……。

ぴょぴょ 2010/12/16(木) 09:12:24
[[解決]]
いろいろ試してみましたが、1つのフォントで全部は無理のようです。
よって、TEXT("Meiryo")フォントとTEXT("MS ゴシック")フォントなどを複数利用して
描画します。
でも、全ての描画はまだ無理っぽい。

一通り解決とします。
ありがとうございました。

古いスレッドには追加発言できません。