読者です 読者をやめる 読者になる 読者になる

風柳メモ

ソフトウェア・プログラミング関連の覚書が中心。

IE11のUser Agentではまる…ファイル名が日本語の場合ダウンロードすると文字化け

ダウンロード時の 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'

のようにしておいた。