人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

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

●質問者: rockafeller
●カテゴリ:コンピュータ インターネット
✍キーワード:JIS P.S. SJIS UTF-16 VC++
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ardarim
●100ポイント

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を参照)

◎質問者からの返答

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

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

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

int code = 0x82A1;

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

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

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


2 ● ardarim
●100ポイント ベストアンサー

シフト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配列を用意しておく必要があります。

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ