技術・開発

IE11でファイルをダウンロードすると文字化けが発生する

2014年2月6日

IE11でテストを行ってるとき、ファイルをダウンロードしようとすると下記ダイアログが表示される。

○○○から=UTF-8_B_NV_jg5XjgqHjgqTjg6vml6XmnKzoqp4ueGxzbQ===を保存しますか?
IE11ダウンロードダイアログ

名前をつけて保存を選択しても下図の通り文字化けした状態となる。

ファイル自体が壊れてるわけではないので拡張子つけて開くと正常に見れますが、なんのファイルかさえもわからない状態になります……

なんでUTF-8…になるのだろう?と原因を調査してみることにしました。

IE11 のユーザエージェントが原因

IE系のダウンロードはChrome等とは異なるURLエンコードが必要です。

例えば、下記の通りユーザーエージェントにMSIEがあれば、URLEncoder.encode関数を、それ以外はMimeUtility.encodeWord関数を使用するようにしていました。

String ua = request.getHeader("User-Agent");
if (ua != null && ua.contains("MSIE")) {
	filename = URLEncoder.encode(filename, "UTF-8");
}else {
	filename = MimeUtility.encodeWord(fileName, "UTF-8", "B");
}

IE10まではユーザーエージェントにMSIEが入っておりましたが、IE11はMSIEが入っていないようです。

  • IE8 :Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
  • IE9 :Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)
  • IE10:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
  • IE11:Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
  • IE11(互換表示設定):Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0;)

解決方法として
ua.contains("MSIE")のとこを
(ua.contains("MSIE")||ua.contains("Trident"))
と変更すれば文字化けすることがなくダウンロードが可能になります。

互換表示設定を行えばMSIEが取れるのでそれで回避もできます。
(閲覧の履歴にて履歴を削除すると再度設定しないといけませんが……)

MSIEをTridentに置き換えればいいじゃん!と思ったのですが、IE7や一部IE8にはTridentがないみたいなので、しばらくは共存が必要ですね。
(むしろIEの独特性がなくなれば……)

-技術・開発
-,