Internet Explorer 11 の仕様変更によりファイルの文字化け問題が続出している模様

これを書いている時点での Internet Explorer 最新版は IE11 なんだけど
このバージョンから重要な部分の仕様が変わってて、
これによってあっちこっちでトラブルが起きてるみたい。

IE かどうかで処理を分ける

Internet Explorer は何かとユニークな挙動をするので
ウェブアプリケーションなとではユーザーのブラウザが IE かどうかを判別して
IE の個性にあわせて挙動を変えるということをよくやりますね。

よく出くわすケースとしては
ブラウザでファイルをダウンロードするときに
IE だと UTF-8 の日本語ファイル名をそのまま渡すと文字化けしてしまうので

ie_downloading_utf8

IE のときだけ Shift_JIS (SJIS-win か) に変換して渡すというの。

Firefox や Google Chrome は
特に何も言わなくても UTF-8 のファイル名を正しく扱ってくれるから対応不要。
IE だけ特別扱いしてもらえていいですね。

これまでの IE 判別のしかた

ブラウザが IE かどうかを判別するのには
ユーザーエージェントを使うのが普通だと思います。

具体的には User agent に MSIE という文字列が入っていたら IE とみなす、
という判別をやってることが多いんじゃないでしょうか。

PHP ならこんな感じですか。

if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {
    //IE 用のなにか
}

IE11 での仕様変更

ところが IE11 から User agent が変わりました。

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko

MSIE がない。

Microsoft によると、次のように変更されたようです。

ユーザー エージェント文字列の変更 (Windows)

  • 互換性 (“compatible”) トークンとブラウザー (“MSIE”) トークンが削除されました。
  • “like Gecko” トークンが追加されました (他のブラウザーとの一貫性のため)。
  • ブラウザーのバージョンが、新しいリビジョン (“rv”) トークンによって報告されます。

その目的は

これらの変更点は、Internet Explorer 11 が (誤って) 以前のバージョンとして識別されることを防ぎます。

繰り返します。

これらの変更点は、Internet Explorer 11 が (誤って) 以前のバージョンとして識別されることを防ぎます。

問題は変わってない

では以前のバージョンのために必要だった対応が
IE11 では不要になったかというとまったくそんなことはなく、
同じく UTF-8 の日本語ファイル名はそのままだと文字化けします。

ところが従来 MSIE の文字列を頼りに行われていた処理が
IE11 からは走らなくなるので
「これまで正しくダウンロードできていたファイルが IE11 では文字化けする」
という現象が起きています。

あまり悪口言いたくないんだけど、
これちょっとひどいんじゃないかと思います。
IE のためにやってた対応が、IE の仕様変更のせいで効かなくなった。

IE 向けの特別な処理が実装されていることと
MSIE で判定が行われてきたことを
Microsoft が知らないわけないと思うんですけどね。

対応するなら

「もう IE なぞ知らん」という選択肢もあると思うんですが、
もし対応するなら

MSIE と Trident のいずれかが入ってたら IE

といったところでしょうか。
前述の PHP コードを修正するならこうか。

if (
    strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false
    || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false
) {
    //IE 用のなにか
}

もうひとつの解決策

日本語ファイル名を使わない。

追記

IE9 からは RFC 6266 をサポートしていて、
Content-Disposition ヘッダーを
attachment; filename*=utf-8'' + [URL エンコードしたファイル名]
とすれば UTF-8 でいけるようになってますね。
この書き方どうもなじめないんだけど。

それでも IE8 以前はこれに対応してないから
それまでに作られたアプリケーションでは当然こんなの実装してないし、
IE9 以降のものでもいちいちバージョンを見て出し分けるのはめんどくさい。
一律 Shift_JIS にしてあるとこが多いんじゃないかと思います。

またこれはファイルダウンロードだけの問題じゃないので、
IE 判別ができなくなってることによって他でも不具合が発生するんじゃないかな。

古い jQuery あたりで何かくずれてそうなんだけどどうなんだろう。

  • このエントリーをはてなブックマークに追加