今回のテーマはずばり、「~」文字についてです。
この文字による文字化けで悩まされたことのある人も多いはずです。
なぜこの文字がそんなにややこしいかというと、
実はこの「~」には2種類の文字があるのです。
Type A : 
Type B : 
若干違いますね。
通常見慣れているのはType Aの方でしょうか。
Windowsが標準で採用している文字コードです。
後述しますが、これは「Shift_JIS」とは異なるものです。
ほとんど似てはいますが、少しでも異なるという事は
全く違うものだという認識をしておいた方が良いでしょう。
この文字コードでは、Type A は表現できますが
Type B は表現できません。
つまり、ほとんどの人がType A の「~」しか知らないわけです。
JIS X 0208で定められている文字コードです。
こちらは、Type B の「~」しか表現できません。
というわけで、Windows-31J とは違います。
しかし、ほとんどの場合 Windows-31J の別名として「Shift_JIS」という名称が使われています。
これが混乱の元なのです。
正確に言えば Windows-31J のことを、こう言っている。
正確な意味での Shift_JIS のことを、こう言っている。
つまり、意味が異なります。Javaで言うところのShift_JISは、通常まず使う場面はありません。
Unix系では、これがデフォルトの文字コードです。
これもShift_JISと同じように、紛らわしい点があります。
そもそも EUC-JP には複数の亜種があり、「これがEUC-JPだ!」というものは存在しません。
それを引っくるめて「EUC-JP」と呼んでいるわけです。
そういった意味では、Shift_JIS よりもタチが悪いです。
Windowsなど、ほとんどの場面で使われているものがこれです。
全ての文字を2バイトで表現します。
Type B の「~」しか表現できません。
Javaで使われているものはこっちです。
一部の文字を3バイトで表現するので CP51932 より表現できる文字種は多いですが
CP51932 に存在する一部の特殊文字は表現できません。
Type A/B 両方の「~」を表現することができます。
というわけで、これらは似ていますがやはり異なるものです。
特に、3バイトで表現された文字リテラルは
CP51932の方では処理できず、文字化けを起こしてしまいます。
Type A の「~」は3バイトで表現されるため、
ほとんどのブラウザやエディタでは文字化けを起こします。
ちなみに、Firefox ではこの文字を正しく処理できるようです。
現在の世界標準になっている文字コードです。
UTF-8では、Type A/B 両方の「~」を表現することができます。
これにより、どういった場面で文字化けが起こるのでしょうか。
一番多いのが、EUC-JP(CP51932) を使った場合です。
先程説明したように、EUC-JP では Type B の「~」しか扱えません。
しかし、ほとんどの日本語フォントは MS932(Shift_JIS) を使っているので
Type B の「~」は表現できないし、入力することも不可能なのです。
ここにまず矛盾がある訳ですが、ほとんどのブラウザやエディタでは
これを強引に解決してしまっています。
例えば「~」を入力してファイルを保存したとします。
それは本来 Type A の「~」であるはずですが、EUC-JP では Type A の「~」は扱えないので
Type B の「~」と勝手に解釈して保存してしまいます。
次に、このファイルをJava経由で読み込みます。
そしてそのファイル内容を MS932(Shift_JIS) として表示しようとしたらどうなるでしょうか。
「~」は Type B なので、MS932 には変換できません。
その結果、「~」は ? という文字で表示されてしまいます。
結論から言えば、JavaでEUC-JPを使うなら「~」文字の解決を
自分でしなくてはならないという事です。
Windows-31J や UTF-8 なら Type A の「~」を扱うことが出来るので問題はありません。
Javaは Windows-31J(Windows版Shift_JIS) を扱うことが出来ますが
Windows版EUC-JP を扱うことが出来ないのです。
Javaで「Shift_JIS」「EUC-JP」といった文字コードは、使わない方が無難です。
オススメなのは UTF-8 です。これは世界標準の文字コードですし
文字化けの心配もありません。