文字コードの変換

あまり知られていないことですが、WindowsAPIである MultiByteToWideChar および WideCharToMultiByte を使うと、ISO-2022-JPUTF-8などの各種の文字コードを変換することができます。正確に言うと、Unicodeとそれ以外のコードページ間で文字列をマップすることができる、ということです。変換は、Unicodeとそれ以外のコードページの間で行うことになりますので、ISO-2022-JPシフトJIS(Windows-31J)のような、Unicode以外の文字コード間での変換では、いったん文字列をUnicodeに変換してやる必要があります。

ここまで説明なしに「Unicode」と書きましたが、実はこれは Microsoft 特有の表現であり、UnicodeのUTF-16LEのことを意味しています。同じUnicode*1でもUTF-7UTF-8は特定のコードページを持ったMBCSすなわちマルチバイト文字セットという扱いになっています。すなわち、Windowsにおける文字コードの変換は、UTF-16LEを軸にそれ以外の文字コード、符号化方式を変換する、ということになります。

              ISO-2022-JPシフトJIS ↔ UTF-16LE ↔ UTF-8UTF-7              

勘の鋭い方なら、ここまで意図的にEUC-JPを含めていないことに気づいていると思います。
実は、日本語EUCはコードページ51932として定義されているはずなのですが、手元で試した限り、WideCharToMultiByteが常にERROR_INVALID_PARAMETERを返し、正常に変換できなかったのです。
Windowsのコードページ番号の一覧は http://msdn.microsoft.com/library/en-us/intl/unicode_81rn.asp にあります。
これらのコーディングの実例は後日。

*1:MS用語ではなく本来の意味でのUnicode