webアプリでcsv等のダウンロード用ファイルを返す場合、ieで日本語ファイル名が文字化けするので、その対処法を調べてみました。
次のスクリプトは、httpヘッダを返す部分のみを記述していますが、ieでのポイントは、拡張子以外をurlエンコードすることにあるようです。
sub get_http_download_header { my ($self,$filename) = @_; my $content_disposition; if ($ENV{HTTP_USER_AGENT} =~ /MSIE (.+?);/o){ my $basename = ''; my $extension = ''; if( $filename =~ /(.*?)(\.\p{InBasicLatin}+)/o){ $basename = $1; $extension = $2; } else { $basename = $filename; } #IEでは、拡張子以外をurl encode $filename = $self->url_encode( encode($ENC, $basename)) . $extension; my $ie_ver = $1; if ( $ie_ver eq '5.5'){ $content_disposition = "filename=$filename"; } else { $content_disposition = "attachment; filename=$filename"; } return header(-type=>"application/octet-stream", -Content_Disposition=>$content_disposition); } #firefox3.5でダウンロードファイル名が文字化しなかったのでOKとします #operaやchromeは未確認ですが、文字化したとしてもサポート外ということで. $content_disposition = "attachment; filename=$filename"; return header(-type=>"application/octet-stream", -Content_Disposition=>$content_disposition); }
今回は ie ver.8とfirefox3.5でのみ、動作確認しましたが、operaの場合も異なる対処法が必要らしいので、日本語ファイル名は使わないのが楽かも?