Unicodeの0x2F00~0x2FFFの描画について – プログラミング – Home

通知
すべてクリア

[解決済] Unicodeの0x2F00~0x2FFFの描画について


ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

以前から Unicode 文字の描画ができません。
Unicode 文字の 0x2F00 ~ 0x2FFF は漢字です。
描画すると「・」という文字が描かれます。

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

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


引用未解決
トピックタグ
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

参考のためにソースを載せます。

// フォント・オブジェクトの作成
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
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

単純にフォントにグリフが用意されていないだけでしょう。
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を基にしていま
す。


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

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>
















</FONT>
-------------
上記の Unicode.html をブラウザで見ると 0x2670、0x2671 が十字のような絵文字で表
示されます。
しかし、やはりすべては描画されてない様子です。
つまり、プログラムでは 0x2670、0x2671 コードが「・」に描画されます。
IE8.0では、どのように Unicode 文字を表示してるのでしょうか。
分かりますか。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=2670
で表示させた文字をOneNoteに送ると,フォントはEstrangelo Edessaとなっていました。

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


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

いろいろ試してみましたが、1つのフォントで全部は無理のようです。
よって、TEXT(Meiryo)フォントとTEXT(MS ゴシック)フォントなどを複数利用して
描画します。
でも、全ての描画はまだ無理っぽい。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました