Windows XPでWideCharToMultiByte関数を使い、ISO-2022-JPに変換するときの注意点

前回の記事「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で確認しました。

コメント

  1. Pingback: 黒翼猫のコンピュータ日記 2nd Edition

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください