function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
nabeyakinabeyaki 

ファイル名

VisualforceでCSV出力する際のファイル名ですが、日本語で指定する方法が分かりません。
何かやり方はあるのでしょうか?

試してみたこと
1,VisualforceでfileNameを変数化し、ApexコントローラでfileName='テスト';のように指定する。
→結果、".csv"だけとなってしまいます。
<apex:page cache="true" contentType="text/csv;charset=Shift_JIS;#{!fileName}.csv"

2,Visualforceはファイル名を指定せず、Apexコントローラで
Apexpages.currentPage().getHeaders().put('content-disposition', 'attachment; filename=テスト.csv');
のように指定する。結果".csv"となってしまいます。
 
Best Answer chosen by nabeyaki
nabeyakinabeyaki
自己解決しました。
URLENCODEすれば、日本語になりました。

All Answers

nabeyakinabeyaki
自己解決しました。
URLENCODEすれば、日本語になりました。
This was selected as the best answer
Taiki YoshikawaTaiki Yoshikawa
これずっとできないと思ってました。情報を共有頂きありがとうございます。
nabeyakinabeyaki
windows7しか検証していませんが、
chrome-日本語。
firefox-エンコード文字。
IE11-日本語。
となり、ブラウザにより挙動が異なるようです。素直に日本語は使わない方針にするのが良さげです。
Taiki YoshikawaTaiki Yoshikawa
ブラウザ依存の部分もあるのですね。
勉強になりました。ありがとうございます。
keyhole0keyhole0
解決済みの記事に投稿するのは良くないかなとも思いましたが、他に似たような記事も見つからなかったのでここに投稿します。

Apexコントローラで以下のようにContent-Dispositionのfilename*を指定することでfirefoxも含めて文字化けしなくなります。
String filename = '日本語ファイル名.csv';
String encfn = EncodingUtil.urlEncode(filename, 'UTF-8');
Apexpages.currentPage().getHeaders().put('Content-Disposition', 'attachment;filename*=UTF-8\'\'{fn};filename={fn}'.replace('{fn}', encfn) );
上記のコードでwindows10にてchrome、firefox、edgeで問題なくファイル名が日本語表示されることを確認しています。
これら以外にもfilename*をサポートしているブラウザなら多分問題ないかと思います。

以下はContent-Dispositionのリファレンスです。ご参考ください。
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Disposition