Edited at

send_dataでの日本語ファイル名文字化け対策(IE11対応)

More than 5 years have passed since last update.

IEではダウンロードファイル名にUTFを使うと文字化けするため、

以下のようにURLエンコードを行うかSJISに変換します。


xxx_controller

  file_name = '日本語.csv'

p file_name.encoding # ⇒ #<Encoding:UTF-8>
file_name = ERB::Util.url_encode(file_name)
p file_name.encoding # ⇒ #<Encoding:ASCII-8BIT>

send_data 'a,b,c', # send_fileも同様
filename: file_name,
type: 'text/csv'


FireFoxなどIE以外のブラウザではURLエンコードしたUTFやSJISは文字化けする場合があるので、

IE以外はエンコードさせないようにします。


xxx_controller

  file_name = '日本語.csv'

file_name = ERB::Util.url_encode(file_name) if msie?
...
def msie?
(/MSIE/ =~ request.user_agent) || (/Trident/ =~ request.user_agent)
end

ユーザーエージェントに「MSIE」または「Trident」という文字列が存在すれば、IEと判断します。

IE11ではユーザーエージェントから「MSIE」が削除されたので「Trident」と文字列を見て判断するようにしています。


参考

http://anond.hatelabo.jp/20130219210226

http://furoshiki.hatenadiary.jp/entry/2013/11/11/224605