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