エンコーディングと聞くと、面倒な記憶がある人が多いだろう。特にJavaでの"Shift_JIS"は、いろいろと厄介で、いろいろ指定してみた結果で、まあ一応ちゃんと表示できたからいいや、というパターンが結構あるのでは?
この"Shift_JIS"、実はJ2SEのバージョンで対応する(エイリアスというらしい)コンバータが違うのだ。
現在(2004年2月)標準と思われる1.4.2では、"Shift_JIS"はSJIS用のコンバータにエイリアスされている。ところがそうなったのは1.4.1からで、それまではMS932用のコンバータにエイリアスされていたのだ。さらにややこしいことに、MS932になったのも1.1.8以降で、それまではやはりSJISだった。
| IANA登録名称 | 対応コンバータ(最初) | (1.1.8 - 1.4.0) | (1.4.1 - ) |
|---|---|---|---|
| Shift_JIS | SJIS | MS932 | SJIS |
| Windows-31J | (調査不足により不明) | MS932 | MS932 |
つーかそもそもいろいろな名前がでてきてわからん、という意見もあると思うので、俺なりに整理してみたのが右の表。こうして整理すればそんなには難しくないと思うんだが。
「本当は"Shift_JIS"は"SJIS"コンバータにエイリアスするのが正しい(1.1.8以前の話)。でも、世の中的に"Shift_JIS"といいながらも"MS932"コンバータでないと駄目なことが多かったのでそっちにした(1.4.0までの話)。」ということのようだ。で、「でも最近はxmlとかで"正式な"名前を使うべきという流れが主流になってきたので、おおごとになる前に正しい姿に戻しましょう(1.4.1以降の話)。」ということだそうな。
で、結局どうすりゃいいの?という話だが、まず、(今回説明している範囲で言えば)指定するのは"Shift_JIS"か"Windows-31J"ということ。"SJIS"とかを直接指定しても多分動くんだが、「礼儀正しくない」という認識。俺がね。(多分世の中的にも)
その上で、web系のシステムとか作る時は"Shift_JIS"だろ、という感じか。"Windows-31J"を指定するということは、クライアントとしてWindows環境を前提(は言い過ぎかもしれんが)としているわけで、それは違うのでは、となる。もちろんこういう問題って一概に言えないところが多くて、俺のように極論するタイプは言い過ぎることが多いので、話半分に聞いとくように。
とりあえずすぐに重要なこととして、Windows環境で、実行環境を1.4.1以降に変えたら文字化けするようになった、という場合は、"Shift_JIS"を指定しているところを"Windows-31J"にしてみよう。直る可能性が高い。