Visual Studio 9.0 に Visual C++ アプリケーションがあります。Character Set として「Unicode character Set」を使用してアプリケーションを構築しました。変換には Windows API A2T を使用していますが、マルチバイト文字 (韓国語のテキスト) は正しく変換されません。A2T のコードと、 CP_THREAD_ACP を MultiByteToWideChar の最初のパラメーターとして使用しているのを見ました。同じ API に CP_UTF8 を使用すると、正しい結果が得られます。CP_THREAD_ACP のコメントによると、「現在のスレッドの ANSI コード ページ」が言及されています。Unicode 文字セットを使用してコードを作成したにもかかわらず、A2T 関数が UTF8 を使用しない理由がわかりません。
2 に答える
このA2T
マクロは、関連する ANSI コード ページを使用してエンコードされたTCHAR
文字列を、関連する tchar エンコーディングを使用して文字列に変換するためのものです。「Unicode 文字セット」を有効にしたため、エンコーディングは UTF-16 ですTCHAR
。wchar_t
そのため、A2T
マクロは文字列を ANSI コード ページから UTF-16 に変換します。(Unicode の代わりに ANSI を使用するようにプログラムを設定した場合TCHAR
は、char であり、エンコーディングは ANSI コード ページ エンコーディングであり、A2T
マクロはノーオペレーションになります。)
CP_UTF8
文字列が ANSI コード ページを使用しておらず、代わりに UTF-8 を使用しているという正しい変換が生成されるという事実から明らかです。ANSI コード ページは UTF-8 に設定できないためA2T
、適切な変換方法ではありません。
プログラムの入力文字列のエンコーディングを決定するものと、必要な出力エンコーディングを分析してから、適切な変換ルーチンを選択する必要があります。
たまたま使用している特定の構成のプログラムで、マシンで現在使用されているエンコーディング間で変換するルーチンを探しているだけではないことに注意してください。サポートされているマシンのサポートされている構成で適切なエンコーディングを使用するルーチンを探しています。つまり、選択したルーチンは、プログラムとマシンの構成に応じて、実行する変換を変更する必要があります。たとえば、TCHAR
ベースの関数とマクロは、プログラムの構成方法に基づいて異なるエンコーディングを使用できますが、それらは常に一貫したTCHAR
エンコーディングを使用するため、特定の構成で発生したものに関係なく、常に互いに動作します。
「Unicode 文字セット」とは、Windows API が を使用wchar_t
し、UTF-16 を使用してプログラムと通信することを意味します。プログラムで「狭い」char
文字列を使用している場合は、入力した文字セットを UTF-16 に変換する変換を実行する必要があります。
「Unicode 文字セット」は、何も UTF-8 として解釈されません。