Rails つまみぐい

Rails つまみぐい

Ruby on Rails 初学者による行き当たりばったりなメモ

send_dataでファイルを書き出すときの日本語ファイル名の文字化け対策


ファイルをダウンロードさせるために、send_dataで日本語のファイル名を指定してデータをエクスポートした場合

file_name = "日本語ファイル名.csv"
send_data(data, :type => 'text/csv', :filename => file_name)

InternetExplorerからダウンロードしようとするとファイル名が文字化けしてしまいます。その対策です。


ファイル名をShift-JISに直す

InternetExplorer(以下、IE)でダウンロードする場合、URLエンコードするか、日本語ファイル名をShift-JISコードにすれば文字化けしないようです。

file_name = "日本語ファイル名.csv"
file_name = ERB::Util.url_encode(file_name)
send_data(data, :type => 'text/csv', :filename => file_name)

Shift-JISにするという対応でも動くので、NKFを使ってもOKです。

require 'nkf'
file_name = NKF.nkf('-Ws', file_name)


ブラウザによって対応をかえる

Windows版のFireFoxで試したところ、ファイル名をURLエンコードしてもUTF-8のままでもどちらも正しく解釈してくれます。というわけで、IE限定で対応すればよさそうです。

ブラウザがIEかどうかはUserAgentのバージョントークンと呼ばれる部分で判断できます。IEだと"MSIE"という文字列が入っていますのでこれがある場合に上記の処理をします。

file_name = "日本語ファイル名.csv"
file_name = ERB::Util.url_encode(file_name) if /MSIE/ =~ request.user_agent
send_data(data, :type => 'text/csv', :filename => file_name)


※InternetExplorer独特の仕様というか、逆にFireFoxだとファイル名をShift-JISにすると動かなかったりするので、ブラウザ毎の動作の違いがある、ということでしょう。