win32 vs2005 cで以下のコードを書いています。

static int count;
PAINTSTRUCT ps;
WCHAR str[10];

BeginPaint(hWnd,&ps);
wprintf(str,"%d",count);
TextOut(ps.hdc,10,20,str,wcslen(str));

textoutでcountに代入された数値を表示します。しかし、文字化けします。どうしてでしょうか?
unicode環境です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/10/12 14:29:21
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

ポイント60pt

wprintf(str,"%d",count);

おそらく、勘違いをされているのだと思いますが、

文字列に値をセットするのは printf() ではなく sprintf() になります。

そして、sprintf() の UNICODE 版は、swprintf() になります。

■ ランタイム ライブラリ リファレンス / sprintf、swprintf
http://msdn.microsoft.com/ja-jp/library/ybk95axf%28VS.80%29.aspx

(wprintf() は、printf() の UNICODE 版なので、文字列には値はセットされません。文字化けしているのは、これが原因だと思われます。)


UNICODE 文字列を使う場合は、多くの文字列操作関数を UNICODE 版の関数に置き換えてあげる必要があります。

以下は、その置き換えるべき関数の一覧になります。

■ 汎用テキスト マップ / ルーチンのマップ
http://msdn.microsoft.com/ja-jp/library/tsbaswba%28VS.80%29.aspx

sprintf() を swprintf() に置き換えた場合は、以下のようになります。

swprintf(str, L"%d", count);

このように UNICODE 版の関数を使用する場合は ""(ダブルクォーテーション)の前に「L」という接頭字(プレフィックス)を追加する必要があります。

こうすることで文字列が UNICODE(wchar_t 型)として処理されます。


<参考情報>
■ charとUnicodeとワイド文字をごっちゃにしないために
http://marupeke296.com/CPP_charUnicodeWideChar.html
id:mai_mai_mail

解決しました。

2009/10/12 14:29:15

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません