2016-04-22 19 views
-1

TextOut()を使用して標準ASCII文字列を画面に表示しているプログラムがあります。 Shift-JISでエンコードされた文字列を出力する機能を追加したいと考えています。 TextOut()にShift-JIS文字列を印刷したいとか、別の機能をすべて使用する必要がありますか? TextOutのドキュメンテーションはエンコーディングについて言及していないようです。TextOut()とShift-JIS(日本語文字)

FYI:私のプログラムは現在MS Visual Studio 2015でコンパイルされており、「文字セット」は「複数バイト文字セットを使用」に設定されています。

+0

Windows APIがどのようにエンコーディングを処理するのかを知る必要があります。実行されるプロセスにはANSIエンコーディングがあり、IIRCはプログラムが実行されているWindowsの特定のインストールによって決定され、何でも(Shift-JISを含む)、「Unicode」または「Wide」エンコーディングUTF-16です。あなたがしたいことは、 'MultiByteToWideChar()'を使ってShift-JISをUTF-16に変換し、 'TextOutW()'を使ってUTF-16文字列を描くことです。これは、構成に関係なく、どのWindowsシステムでも機能します。 – andlabs

+0

私は自分の英語版のWindows PCと、日本のPCを日本で使っています。あなたは、私はPCがどのように設定されているかに応じて、違うやり方をする必要があると言っていますか? – Mick

+1

マルチバイト文字セットオプションを使用しているとします。 Unicodeを変換し、Unicodeを必要とする最新のWindows API( 'W'接尾辞付きの関数、' #define UNICODE'と '#define _UNICODE'、そして必要なVSプロジェクトオプション)を使用すれば、あなたの人生はより簡単になります。 'MultiByteToWideChar()'と 'WideCharToMultiByte()'はいずれもコードページとして932を渡してShift-JISをサポートしています。 (これらの名前は定数のようには思われません...) – andlabs

答えて

1

andlabsのおかげで、完全な答えが得られます。これは、プログラムが "文字セット"が "複数バイト文字セットを使用"に設定されてコンパイルされている場合に機能します。私はunicodeに設定された "文字セット"をコンパイルしたくないので、既存のコードがあまりにも混乱してしまいます。

char shift_jis_string[MAX_STR_LEN]; // null terminated 

    // blah blah, setting shift_jis_string 

    WCHAR unicode_string[MAX_STR_LEN]; 

    int n = MultiByteToWideChar(932,0,shift_jis_string,-1,unicode_string,MAX_STR_LEN); 

    TextOutW(hdc,X,Y, unicode_string, n); // note the W on the end 
関連する問題