前回の記事「Windows 2000でWideCharToMultiByte関数を使うと、ISO-2022-JPのバイト数を間違う」では、 Windows 2000におけるWideCharToMultiByte関数の問題を調べました。
今回はWideCharToMultiByte関数のWindows XPでの問題です。
次のようにユニコード文字列をISO-2022-JPに変換した場合、
AnsiStringT<50220> jis = L"abcあいう";
Windows XPでは変数jisのバイトコードは「abc<ESC>あいう」のようになります。
<ESC>はエスケープシーケンスを表しています。
なお、Windows 7では「abc<ESC>あいう<ESC>」のようになります。
※UnicodeStringからAnsiStringTへの変換は、内部でWideCharToMultiByte関数を使用しています。
これが問題になるのは次のようなコードの時です。
AnsiStringT<50220> jis = L"abcあいう";
AnsiStringT<50220> jis2 = jis + jis;
Windows XPでは変数jis2のバイトコードは「abc<ESC>あいうabc<ESC>あいう」のようになってしまいます。
「あいうabc」の間に<ESC>がないため、文字化けが発生します。
なお、Windows 7では「abc<ESC>あいう<ESC>abc<ESC>あいう<ESC>」となり問題は発生しません。
Windows XPでも、WideCharToMultiByte関数を使ってISO-2022-JPに変換するときには注意が必要です。
今回のコードは、C++Builder2010で確認しました。