Unicodeと各コードページ間での変換

Windows では、Unicodeと各コードページの間で文字列を変換するための関数として、従来からの MultiByteToWideChar および WideCharToMultiByte といった Kernel32.dll に含まれる系列と、
Mlang.DLL に含まれる ConvertINetStringConvertINetUnicodeToMultiByteConvertINetMultiByteToUnicode の系列の2種類が用意されています。
また Unicode を除く、日本語に関するコードページは

  • 932 (ANSI/OEM - 日本語 Shift-JIS)
  • 20932 (JIS X 0208-1990 & 0212-1990)
  • 50220 (ISO-2022 日本語、半角カタカナなし)
  • 50221 (ISO-2022 日本語、半角カタカナ)
  • 50222 (ISO-2022 日本語 JIS X 0201-1989)
  • 51932 (EUC - Japanese)

の6種類があります。*1

U+0020〜U+FFFFまでのUnicodeの各文字が、それぞれの変換機構およびそれぞれのコードページでどのようにマッピングされるのかを調べ、一覧を作成してみました
これをみると、

  • MicrosoftEUC-JP だとしている CP51932 は、MLang.DLL では変換可能ですが、Kernel32.DLL では変換不可能なこと
  • 50220 や 50221、50222 の ISO-2022 系のコードページでは、Kernel32.DLL では JIS X 0212-1990 の補助漢字が扱えるが、MLang.DLL ではそうではないこと
  • 世間で EUC-JP だとされている CP20932 と、MicrosoftEUC-JP だとしている CP51932 は、変換ルールが異なっていること

などがわかります。

*1: ()内は、GetCPInfoEx により得られたものです。ただし、51932 に関しては、GetCPInfoEx では情報を取得できませんので、Code Page Identifiers に挙げられている説明を書いてあります。