現在VC++で文字コードを指定して文字を描画したいと考えております.
http://codezine.jp/a/article/aid/1643.aspx?p=2 を参考に
TextOutを使ってUTF-16で描画はできたのですが,SJISやJISで指定した文字を描画することができません.
どのようなコードを書いたらよいのかご存知の方がいらっしゃいましたら,ご連絡いただけないでしょうか?
また参考になりそうなサイトがありましたらあわせて教えていただきたいです.
よろしくお願いいたします.
p.s.
TextOutAを使うとできそうな気がするのですが,具体的にどうやって記述したらよいのかがわかりません.
シフト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配列を用意しておく必要があります。
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[]に変換すればよいのかご存知でしょうか?
何度も質問してしまい申し訳ありませんが,ご連絡いただけたら幸いです.
よろしくお願いいたします.
シフト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配列を用意しておく必要があります。
親切にありがとうございました.
無事プログラムが実行でき,おかげさまで文字コードの理解が深まりました.
また機会がありましたらよろしくお願いいたします.
このたびは本当にありがとうございました.
親切にありがとうございました.
無事プログラムが実行でき,おかげさまで文字コードの理解が深まりました.
また機会がありましたらよろしくお願いいたします.
このたびは本当にありがとうございました.