VC++でプログラムをたまに書く程度の初心者です.


現在VC++で文字コードを指定して文字を描画したいと考えております.

http://codezine.jp/a/article/aid/1643.aspx?p=2 を参考に
TextOutを使ってUTF-16で描画はできたのですが,SJISやJISで指定した文字を描画することができません.

どのようなコードを書いたらよいのかご存知の方がいらっしゃいましたら,ご連絡いただけないでしょうか?
また参考になりそうなサイトがありましたらあわせて教えていただきたいです.

よろしくお願いいたします.

p.s.
TextOutAを使うとできそうな気がするのですが,具体的にどうやって記述したらよいのかがわかりません.

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

ベストアンサー

id:ardarim No.2

回答回数897ベストアンサー獲得回数145

ポイント100pt

シフトJIS文字列と言うのは、1バイトで表現できる英数字や2バイトで表現する漢字が混在した文字列で、基本単位は1バイト(charやunsigned char)で表されます。

int型で用意されたシフトJISコードをchar型の配列(文字列)に入れるには、上位8ビット分を配列の1バイト目に、下位8ビット分を配列の2バイト目に入れます。


例えば、次のような感じです。

int code = 0x82A1;
char mbs[3];

mbs[0] = (code & 0xff00) >> 8;  // シフトJISの1バイト目
mbs[1] = (code & 0x00ff);       // シフトJISの2バイト目
mbs[2] = 0x00;                  // 文字列の終端を表すnullコード
TextOutA(hdc, 0, 0, mbs, lstrlen(mbs));

シフトJISを1文字表示する場合は、シフトJISを格納する2バイト分と、文字列の終端を表すnullコードを入れるための合計3バイト分のchar配列を用意しておく必要があります。

id:rockafeller

親切にありがとうございました.

無事プログラムが実行でき,おかげさまで文字コードの理解が深まりました.

また機会がありましたらよろしくお願いいたします.

このたびは本当にありがとうございました.

2008/07/19 01:05:05

その他の回答1件)

id:ardarim No.1

回答回数897ベストアンサー獲得回数145

ポイント100pt

TextOutAはTextOutWと使い方は全く同じです。

引数がシフトJIS文字列であるか、Unicodeであるかが異なるだけです。

従って、次のように使います。


シフトJISの場合

char mbs[] = { 0x82, 0xA0, 0x00 };    // 'あ'=0x82A0
TextOutA(hdc, 0, 0, mbs, lstrlen(mbs));

Unicodeの場合

wchar_t ws[] = { 0x3042, 0x0000 };  // 'あ'=0x3042;
TextOutW(hdc, 0, 0, ws, lstrlenW(ws));

JISコードはそのままではAPIで扱えませんので、シフトJISに変換してあとは上記方法でシフトJISとして表示します。

変換方法:JIS, EUC, SJIS の漢字コードについて(一番下にJISからシフトJIS変換のアルゴリズム)

変換サンプル:Japanese Kanji Code(JIStoSJISを参照)

id:rockafeller

回答くださりありがとうございます.

早速上記のように記述することで描画することができました.

プログラムでは'あ'=0x82A0 から順に文字コードを増やしていこうと思います.

int code = 0x82A1;

と記述した場合どうやってmbs[]に変換すればよいのかご存知でしょうか?

何度も質問してしまい申し訳ありませんが,ご連絡いただけたら幸いです.

よろしくお願いいたします.

2008/07/18 20:01:02
id:ardarim No.2

回答回数897ベストアンサー獲得回数145ここでベストアンサー

ポイント100pt

シフトJIS文字列と言うのは、1バイトで表現できる英数字や2バイトで表現する漢字が混在した文字列で、基本単位は1バイト(charやunsigned char)で表されます。

int型で用意されたシフトJISコードをchar型の配列(文字列)に入れるには、上位8ビット分を配列の1バイト目に、下位8ビット分を配列の2バイト目に入れます。


例えば、次のような感じです。

int code = 0x82A1;
char mbs[3];

mbs[0] = (code & 0xff00) >> 8;  // シフトJISの1バイト目
mbs[1] = (code & 0x00ff);       // シフトJISの2バイト目
mbs[2] = 0x00;                  // 文字列の終端を表すnullコード
TextOutA(hdc, 0, 0, mbs, lstrlen(mbs));

シフトJISを1文字表示する場合は、シフトJISを格納する2バイト分と、文字列の終端を表すnullコードを入れるための合計3バイト分のchar配列を用意しておく必要があります。

id:rockafeller

親切にありがとうございました.

無事プログラムが実行でき,おかげさまで文字コードの理解が深まりました.

また機会がありましたらよろしくお願いいたします.

このたびは本当にありがとうございました.

2008/07/19 01:05:05

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

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

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

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

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