IE は "Windows-31J" に対応していない

いわゆる "シフト JIS" には、JIS 規格通りのものと Windows で拡張されているものの 2 種類があり、IANA には、それぞれ "Shift_JIS" および "Windows-31J" として登録されている。
いわゆる機種依存文字 (IBM 拡張文字、NEC 拡張文字など) を使う場合、それらは Windows の拡張部分に入っているので、HTTP ヘッダで

Content-Type: text/html; charset=Windows-31J

としたり、同じ内容を HTML ファイル内で

<meta http-equiv="Content-Type" content="text/html; charset=Windows-31J">

と指定するのが (IANA 的には) 正しい、ということになる。
ところが、そうやって指定をしたページを Internet Explorer で見ると、文字化けしてしまうことがある。わざわざ Windows/IE に合わせたつもりが、逆効果になってしまうことになる。

原因

IE は、"Windows-31J" という charset 名に対応していない。したがって「有効な charset 指定がない」と判断し、(設定で有効になっていれば) 文字コードの自動判別が実行される。で、例えばその HTML 内の初めの方に ISO-8859-1 文字しかなかったりすると、ページ全体が ISO-8859-1 と判定されてしまい、文字化けが発生することになる。
どうも Microsoft 的には、「Windows が使っているのは "Shift_JIS" ですが何か?」ということらしい。直接 IE について書かれた情報ではないが、下記のサポート技術情報では、「Shift_JISWindows-31J も MS932 の別名」という立場を取っている。

[]260818 - FIX
JIS Japanese Character Encoding Throws Exception[]:http://support.microsoft.com/?scid=kb;en-us;260818

回避策

ネットで検索してみると、回避策っぽいものは見つかる。あきらめて、HTML ファイル内では

<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

と指定する、というものだ。
ただし、例えば JSP で出力する場合、page ディレクティブで出力 charset を Shift_JIS にしてしまうと、一部の文字が出力できない (前述のいわゆる機種依存文字。また、「UnicodeShift_JIS」コンバータと「UnicodeWindows-31J」コンバータの挙動が違うために "〜" などの文字が "?" に置き換えられてしまうパターンがある)。そこで、page ディレクティブでは Windows-31J と指定しておき、出力されるページ内の meta 要素では Shift_JIS を指定する、という形にすると、IE でも見られるようになるらしい。
ただし JSP の場合、page ディレクティブで Windows-31J を指定すると、HTTP ヘッダにもそのまま出力されるので、HTTP ヘッダと HTML の中身が一致しないという、不自然な状況にはなってしまう。
これを避けたい場合には、出力を UTF-8 にしてしまう、という方法もある。Shift_JIS での出力にこだわらないのであれば、これが一番マトモかもしれない。