LoginSignup
4
3

MS932 CP943C 変換問題

Last updated at Posted at 2020-09-27

Shift_JIS の文字を Unicode に変換する際、文字エンコーディング(=変換テーブル)が異なると問題になることがある。

Shift_JIS

Shift_JIS では「あ」を「0x82A0」、「い」を「0x82A2」、「う」を「0x82A4」で表すように決められている。
Shift_JIS のテキストファイルで「あいう」と書いて、バイナリエディタで開くと確認できる。

あ 0x82A0 (Shift_JIS)
い 0x82A2 (Shift_JIS)
う 0x02A4 (Shift_JIS)

図.バイナリエディタでShift_JISのテキストファイルを開いたところ
image.png

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 文字が異なってしまう。これはバグではなくエンコーディングの仕様です。

バグではなく、エンコーディングの仕様
image.png

表にすると以下のようになる。

文字 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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3