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 文字が異なってしまう。これはバグではなくエンコーディングの仕様です。
↓
バグではなく、エンコーディングの仕様
表にすると以下のようになる。
文字 | Shift_JIS | MS932でのUnicode変換結果 | Cp943CでのUnicode変換結果 |
---|---|---|---|
- | 0x817C | u+FF0D | u+2212 |
― | 0x815C | u+2015 | u+2014 |
~ | 0x8160 | u+FF5E | u+301C |
∥ | 0x8161 | u+2225 | u+2016 |
¦ | 0xFA55 | u+FFE4 | u+00A6 |
「ユニコード名」を表に加えると以下の通り。
文字 | Shift_JIS | MS932でのUnicode変換結果 | Cp943CでのUnicode変換結果 |
---|---|---|---|
- | 0x817C | - u+FF0D (FULLWIDTH HYPHEN-MINUS) | − u+2212 (MINUS SIGN) |
― | 0x815C | ― u+2015 (HORIZONTAL BAR) | — u+2014 (EM DASH) |
~ | 0x8160 | ~ u+FF5E (FULLWIDTH TILDE) | 〜 u+301C (WAVE DASH) |
∥ | 0x8161 | ∥ u+2225 (PARALLEL TO) | ‖ u+2016 (DOUBLE VERTICAL LINE) |
¦ | 0xFA55 | ¦ u+FFE4 (FULLWIDTH BROKEN BAR) | ¦ u+00A6 (BROKEN BAR) |
以下は native2ascii での結果。
native2ascii -encoding MS932 sjis.txt
\uff0d\u2015\uff5e\u2225\uffe4
native2ascii -encoding Cp943C sjis.txt
\u2212\u2014\u301c\u2016\u00a6
以下リンクからの転載記事です。
https://sites.google.com/site/myitmemo/java-kanren/unicode/ms932-vs-cp943c