文字エンコーディング毎のUnicodeマッピングの違いについて。

Javaにおいて、文字コードの変換は、文字エンコーディング対Unicodeの変換表を使用して行われます。
同じ字形でも、文字エンコーディングによってUnicodeとのマッピングが異なるので注意が必要です。


文字エンコーディングによって、Unicodeとのマッピングが異なる字形について、下記の表にまとめます。
なお、下記表で「JIS X 0212」と書いてある項目以外は、「JIS X 0208」の字形となります。
参考:Enjoy×Study - 文字エンコーディング毎の収録文字の違いについて。

確認したバージョンは、Sun J2SE 1.4.2になります。

















































































字形 ¢ £ ¬ 〜(JIS X 0212)
コード シフトJIS 0x8191 0x8192 0x81CA 0x8161 0x817C 0x8160 0x815C
日本語EUC 0xA1F1 0xA1F2 0xA2CC 0xA1C2 0xA1DD 0xA1C1 0xA1BD 0x8FA2B7
Unicodeとの
マッピング
Windows-31J,
MS932
\uFFE0 \uFFE1 \uFFE2 \u2225 \uFF0D \uFF5E \u2015
Shift_JIS,
SJIS
\u00A2 \u00A3 \u00AC \u2016 \u2212 \u301C \u2014
EUC-JP \u00A2 \u00A3 \u00AC \u2016 \u2212 \u301C \u2014 \uFF5E
EUCJP-OPEN \u00A2 \u00A3 \u00AC \u2016 \u2212 \u301C \u2014 \uFF5E

上記表への補足事項です。

  • Shift_JIS」は、J2SE1.4.1より前は「MS932」にエイリアスされていたので、1.4.1より前の場合は、「MS932」と同じ欄を見てください。
  • 「EUCJP-OPEN」が使用可能なのは、J2SE1.4.2以降になります。

上記の表にあるように、まったく同じJIS規格の同じ字形でも、文字エンコーディングによってUnicodeとのマッピングが異なってきます。
これは、Unicode上に似た字形が複数あるためであり、ベンダによってマッピングした文字が異なっているためです。


差分を意識せずに、複数の文字コード扱おうとすると、文字化けの原因となる場合があります。
例えば、Windows-31Jで読み込んだファイルを、EUC-JPとして出力しようとした場合、そのままでは上記表の文字が化けてしまいます。
(差分を補正するような処理が必要となる)


私自身、この表みて、差分を補正する処理を盛り込む事が多々あります。
システムへの入出力の文字エンコーディングが統一されていれば、そのような手間は省けますが、DBなども絡んできて、様々な文字エンコーディングを扱わなければならない場合が多いと思います。

Shift_JISWindows-31J

Unicodeコンソーシアムでは、JISとUnicodeの変換表として、下記を配布しています。

上記は1994年から配布されており、以前は「OBSOLETE」というパスは付いてなかったようです。
「OBSOLETE」と付いたのは、各ベンダの対応にて、上記と異なるマッピングが採用されたからだと思われます。
特に、Microsoft(Windows)で採用したマッピングが、上記と異なってしまったのが一番でかいのではと…

Microsoftのマッピングについても、Unicodeコンソーシアムにて配布されています。
こちらは1998年から配布されているようです。

Javaの文字エンコーディングの「Shift_JIS」がUnicodeコンソーシアムの「JIS X 0201」、「JIS X 0208」の変換表に基づくもので、「Windows-31J」は、Microsoftの「CP932」に基づくエンコーディングとなっています。

MicrosoftがUnicodeコンソーシアムの変換表を元にしたものを採用していれば、文字化けの悩みは少なくてすんだような気がしてなりません。