ダウンロード時の HTTP Header 出力処理で…
日本語のファイル名を持つ Excel ファイルのダウンロード処理で、IEとそれ以外とで Content-Type と Content-Disposition を
ua = os.environ['HTTP_USER_AGENT'] # User Agent に 'MSIE' が含まれているかどうかで charset を変更 charset = 'shift_jis' if re.search(u'msie', ua, re.I) else 'utf-8' if is_xlsx: print 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=' + charset else: print 'Content-Type: application/vnd.ms-excel; charset=shift_jis' print (u'Content-Disposition: attachment; filename="%s"' % (filename)).encode(charset,'replace')
のようにして切り替えていたのだけれども、今回 IE11 で試してみると文字化けするようになっていた。
気付くのが遅いという話だが。
原因
IE10まではMSIEの文字列とその直後の数字で、Webブラウザ・バージョンの判定ができていました。多くのサービスが、判定にはこの文字列を利用しているはずです。しかし、IE11からは「MSIE」の文字列が無くなり、バージョンを表す数字も削除されてしまいました。
ただし、Tridentというブラウザエンジンを判断する情報は残されています。また、新しく「rv:11.0」というバージョンを表す別の情報が追加されています。
IE11のユーザエージェント問題 - 開発者側でできる対策 (判定方法の変更/互換性モードの利用) - ふろしき.js![]()
対策
とりあえず
# User Agent に 'MSIE' もしくは 'Trident' が含まれているかどうかで charset を変更 charset = 'shift_jis' if re.search(u'(?:msie|trident)', ua, re.I) else 'utf-8'
のようにしておいた。