Help us understand the problem. What is going on with this article?

Perlでファイル名の文字化けIE対応

More than 1 year has passed since last update.

めちゃくちゃ苦戦しました。IE滅ぶべし†
調べてもPHPの記事しかでてこないんですよね。ということで、自分と同じ状況になっているパーラーを助けるべく記事として残します。

解決策

いってしまうとこれでOKです。レスポンスヘッダにファイル名を明記します。

# 日本語ファイル名である、$file_nameを引数として受け取る

$c->res->header(
       'content_disposition' => "attachment;
                                 filename=$file_name.csv;
                                 filename*=UTF-8''$file_name.csv",
   );

filenameが2行あるのがミソで、filename*が有効なブラウザではfilename側は無視されるという特徴を突いた記述になります。

参考)https://tools.ietf.org/html/rfc6266#section-4.3

もちろん、日本語のファイル名を渡す際にURIエンコードしてくださいね!

use URI::Escape;
$file_name = URI::Escape::uri_escape($file_name);
  • 日本語ファイル名はURIエンコードして渡す
  • 日本語でないファイル名は通常通り渡す
    • 別にURIエンコードしてもOK!

このルールさえ徹底すれば、日本語ファイルでも問題なく全ブラウザでエンコードする事ができます。
全ブラウザとか言ってますが、以下でしか動作確認してないので注意。スマホとかOperaは知りません。

  • IE11
  • Edge
  • GoogleChrome
  • FireFox
  • Safali
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away