Shift_JISとWindows-31jでUnicodeへのコードポイントが異なる。

http://homebrew.jp/show?page=228

WIndows-31J / CP932 / MS932 - Shift_JISでとは随所に違いがみられます。別名、CP932 や MS932ともいいます。全角ハイフン「-」や全角の波型「~」などのコードをUNICODEに変換する場合、Shift_JISと違うので、文字化けします。機種依存文字だけUnicodeとの変換表を追加すればよかっただけのものを、MSがShift_JISにある文字までJISと違うUnicode上のコードに割り当てたのが混乱の原因。

http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000716.html

CP932は、シフトJISを拡張したものである。
ただし、基本的には文字コードとしての違いはない。各文字の「整数値としての値」が異なることはない。

違いが現れるのは、他の文字コードへと変換する場合である。
他の文字コードへと変換する場合、「〜」や「−」といった一部の文字が、異なる整数値へと変換される。

http://www.atmarkit.co.jp/fjava/rensai3/mojibake02/mojibake02.html

Windows-31JUnicode間の変換ルールは、そのほかの文字コードに用いられる変換ルールとはまったく異なる。よって、Windows-31Jとそのほかの文字コードShift_JISEUC_JP、ISO-2022-JPなど)の両方を扱わなくてはならないJavaアプリケーションでは、この問題が表面化しやすい


http://www.y-adagio.com/public/standards/tr_xml_jpf/toc.htm