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