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_JISとWindows-31J
Unicodeコンソーシアムでは、JISとUnicodeの変換表として、下記を配布しています。
- JIS X 0201
ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0201.TXT - JIS X 0208
ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT
上記は1994年から配布されており、以前は「OBSOLETE」というパスは付いてなかったようです。
「OBSOLETE」と付いたのは、各ベンダの対応にて、上記と異なるマッピングが採用されたからだと思われます。
特に、Microsoft(Windows)で採用したマッピングが、上記と異なってしまったのが一番でかいのではと…
Microsoftのマッピングについても、Unicodeコンソーシアムにて配布されています。
こちらは1998年から配布されているようです。
Javaの文字エンコーディングの「Shift_JIS」がUnicodeコンソーシアムの「JIS X 0201」、「JIS X 0208」の変換表に基づくもので、「Windows-31J」は、Microsoftの「CP932」に基づくエンコーディングとなっています。
MicrosoftがUnicodeコンソーシアムの変換表を元にしたものを採用していれば、文字化けの悩みは少なくてすんだような気がしてなりません。