iconv、Java、PythonのJISX02132013年05月11日 21:33

JISX0201とJISX0213を併用したデータをShift_JIS-2004で符号化し、iconv、Java、PythonでUTF-8に変換した結果を比較してみた。
(原則としてJISX0213はそれ自身で完結した文字集合でありJISX0208のようにJISX0201と併用するものではないが、JISX0213に移行する際にはJISX0201とJISX0208を併用した既存のデータをShit_JIS-2004として扱いたい場合もありえるので、試してみた。)

各々のバージョンとエンコーディング名は次のとおり。

  • iconv (Debian EGLIBC 2.11.3-4) 2.11.3 --from-code=SHIFT_JISX0213
  • java version "1.7.0_21" Charset-name "x-SJIS_0213"
  • Python version 3.3.1 encoding 'shift_jis_2004'

(ブラウザによっては、U+005Cが[REVERSE SOLIDUS]ではなく[YEN SIGN]に表示される場合があります。
WindowsではIE9で問題なく[REVERSE SOLIDUS]が表示されましたが、FirefoxとGoogleChromeではフォントを変更する必要がありました。
また、使われているフォントによっては見た目では「全角」「半角」の区別がつきにくい場合もあります。)

変換した結果
Seq. Shift_JIS-2004 iconv Java Python
10x5C¥(U+00A5)\(U+005C)¥(U+00A5)
20x7E‾(U+203E)~(U+007E)‾(U+203E)
30x815C—(U+2014)—(U+2014)―(U+2015)
40x815F\(U+FF3C)\(U+FF3C)\(U+005C)
50x81B0~(U+FF5E)~(U+FF5E)~(U+007E)
60x81D4⦅(U+FF5F)⦅(U+FF5F)⦅(U+2985)
70x81D5⦆(U+FF60)⦆(U+FF60)⦆(U+2986)

  • 「1」の0x5Cは[YEN SIGN]なので、U+00A5が正解。ASCIIとJISX0213の併用でない限り、U+005C[REVERSE SOLIDUS]はありえない。
  • 「2」の0x7Eは[OVERLINE]なので、U+203Eが正解。ASCIIとJISX0213の併用でない限り、U+007E[TILDE]はありえない。
  • 「3」は微妙。U+2014は[EM DASH]、U+2015は[HORIZONTAL BAR]。
    「Project X0213(x0213.org) 」の資料を見ると、「0x213D U+2014 # EM DASH Windows: U+2015」となっている。Pythonが不正解とは言い切れない。
  • 「4」~「7」はいわゆる「全角」「半角」のどちらを選ぶかの問題。Pythonは「半角」になっている。
    JISX0201とJISX0213に同じ文字があればJISX0213の側は「全角」を採用し、なければ「半角」を採用するという規則にすれば「半角」が正解。
    なお、iconv、Java、Pythonとも、「4」~「7」の4文字を除いてJISX0201と重複するJISX0213の英数字と記号はすべて「全角」になっていた。
    正規化すれば済む話だから「どっちでもいい」が正解なのかも。

「1」と「2」については、所謂「¥」記号問題のため、「UNICODEを利用するアプリケーションは0x7F以下のコードに関しては移動させない」と言う暗黙のルールに従えば、Javaが正解とも言える。(2013.11.1 追記)

コメント

トラックバック