hnwの日記

UTF-8→SJIS/EUC-JPの重複文字をまとめてみた

文字エンコーディングの変換を行うと、異なる2文字が同じ文字に変換されることがあります。このような文字を重複文字と呼ぶことにします。UTF-8Shift_JISおよびUTF-8EUC-JPについて、重複文字を自分用の資料としてまとめてみました。


MacOSX上のPHP5.2.9での実験結果ですが、プログラミング言語や環境によらず気をつけるべき文字一覧ということになると思います。


色のついている部分が重複している部分です。「-」となっているのは変換できなかった文字です。また、ヘッダのカッコ数字ごとに文字エンコーディング変換に利用した関数が異なります。詳細は下記の通りです。

  • (1) mb_convert_encoding($char, "Shift_JIS", "UTF-8")
  • (2) mb_convert_encoding($char, "SJIS-win", "UTF-8")
  • (3) iconv("UTF-8", "SHIFT-JIS", $char));
  • (4) iconv("UTF-8", "CP932", $char));
  • (5) mb_convert_encoding($char, "EUC-JP", "UTF-8")
  • (6) mb_convert_encoding($char, "eucJP-win", "UTF-8")
  • (7) iconv("UTF-8", "EUC-JP", $char));
  • (8) iconv("UTF-8", "EUC-JP-MS", $char));
- UTF-8 SJIS
(1)

(2)

(3)

(4)
EUC-JP
(5)

(6)

(7)

(8)

5c 5c 5c - 5c 5c 5c 5c 5c

c2a5 818f 818f 5c - - a1ef 5c 5c

efbfa5 818f 818f 818f 818f a1ef a1ef a1ef a1ef

7e 7e 7e - 7e 7e 7e 7e 7e

e280be 8150 8150 7e - - a1b1 7e 7e

efbfa3 8150 8150 8150 8150 a1b1 a1b1 a1b1 a1b1

e28096 8161 8161 8161 8161 a1c2 a1c2 a1c2 a1c2

e288a5 8161 8161 - 8161 a1c2 a1c2 - a1c2

e28892 817c 817c 817c 817c a1dd a1dd a1dd a1dd

efbc8d 817c 817c - 817c a1dd a1dd - a1dd

e3809c 8160 8160 8160 8160 a1c1 a1c1 a1c1 a1c1

efbd9e 8160 8160 - 8160 a1c1 a1c1 8fa2b7 a1c1

c2a2 8191 8191 8191 8191 a1f1 a1f1 a1f1 a1f1

efbfa0 8191 8191 - 8191 a1f1 a1f1 - a1f1

c2a3 8192 8192 8192 8192 a1f2 a1f2 a1f2 a1f2

efbfa1 8192 8192 - 8192 a1f2 a1f2 - a1f2

c2ac 81ca 81ca 81ca 81ca a2cc a2cc a2cc a2cc

efbfa2 81ca 81ca - 81ca a2cc a2cc - a2cc

c2a6 - - - - 8fa2c3 8fa2c3 8fa2c3 8fa2c3

efbfa4 - fa55 - fa55 - 8fa2c3 - 8fa2c3


(2)と(6)とか、(5)と(6)とかを見比べてみて重複文字が異なるのは不思議な気がします。


iconvの結果は環境ごとに違うと思います。あくまで僕のMacOSX上のlibiconvの挙動ということですが、(3)は僕が何かミスったのかもしれません。0x5cや0x7eといったASCII文字1文字を変換できないんじゃ、怖くて何にも使えない気がします。