MS932 vs CP943C
Shift_JIS の文字を Unicode に変換する際、文字エンコーディング(=変換テーブル)が異なると問題になることがある。
Shift_JIS
Shift_JIS では「あ」を「0x82A0」、「い」を「0x82A2」、「う」を「0x82A4」で表すように決められている。
Shift_JIS のテキストファイルで「あいう」と書いて、バイナリエディタで開くと確認できる。
あ 0x82A0 (Shift_JIS)
い 0x82A2 (Shift_JIS)
う 0x02A4 (Shift_JIS)
図.バイナリエディタでShift_JISのテキストファイルを開いたところ
Shift_JIS -> Unicode 変換 (MS932)
Shift_JIS と Unicode では文字(上の例では「あ」)とコード(上の例では「0x82A0」)の割り当てが異なっているので、変換ルール(文字エンコーディング)が決められている。Windows Java での標準文字エンコーディングである MS932 を使うと、Shift_JIS の「あいう」は以下のように変換される。
あ 0x82A0 (Shift_JIS) -> U+3042 (Unicode) MS932で変換した結果
い 0x82A2 (Shift_JIS) -> U+3044 (Unicode) MS932で変換した結果
う 0x02A4 (Shift_JIS) -> U+3046 (Unicode) MS932で変換した結果
MS932で変換した結果はJava のツールである native2ascii を使っても確認できる。
>native2ascii -encoding MS932 sjis_abc.txt
\u3042\u3044\u3046
日本語文字列でよく使われる文字エンコーディングには MS932C だけでなく Cp943C というのも存在する。
Cp943C を使って「あいう」をUnicodeに変換しても結果は同じである。
あ 0x82A0 (Shift_JIS) -> U+3042 (Unicode) Cp943Cで変換した結果
い 0x82A2 (Shift_JIS) -> U+3044 (Unicode) Cp943Cで変換した結果
う 0x02A4 (Shift_JIS) -> U+3046 (Unicode) Cp943Cで変換した結果
native2ascii でも以下の通り。
>native2ascii -encoding Cp943C sjis_abc.txt
\u3042\u3044\u3046
ところが一部の文字
- 0x817C (Shift_JIS)
― 0x815C (Shift_JIS)
~ 0x8160 (Shift_JIS)
∥ 0x8161 (Shift_JIS)
¦ 0xFA55 (Shift_JIS)
については、MS932とCP943C のそれぞれでUnicodeに変換されたとき、割り当てられるUnicode 文字が異なってしまう。
(これはエンコーディングの仕様)
表にすると以下のようになる。
以下は native2ascii での結果。
>native2ascii -encoding MS932 sjis.txt
\uff0d\u2015\uff5e\u2225\uffe4
>native2ascii -encoding Cp943C sjis.txt
\u2212\u2014\u301c\u2016\u00a6
tags
---
java cp943c 変換
cp943c 変換 java
u+00a6 ms932
ms932 cp943c unicode
ms932 sjis cp943c