本業多忙につきとんと2ヶ月も無沙汰にしてしまったブログだが、ぼちぼちと再開。
リハビリがてら軽めのネタから。
先々月の最後の投稿、「
Internet Explorer 6 でのダウンロード時、既定のファイル名として日本語使うと16文字にカットされてしまう」の類似ネタである。
Webサーバーからの応答ヘッダに、content-disposition: attachment; filename=~ を指定することで、Internet Explorer (以下、IE) はじめ各種Webブラウザにダウンロードダイアログを表示させることができるのは周知のとおり。
特に IE においては、UTF-8エンコードされた文字列を、URLエンコードした形式で、filename=~ に指定してやれば、既定の保存ファイル名に日本語を指定することもできる。
そんな実装を、ASP.NET による Webアプリで実装していたら、とある日、不思議な現象を発見。
既定の保存ファイル名に空白を含む場合、なんと、IE のファイル保存ダイアログには、空白が "+" に化けたファイル名が表示されるのだ。
いや、"化ける" とは言ったが、厳密には、たしかに "+" は空白を URL エンコードした結果には違いない。
言い換えると、ほかの文字列(とくに日本語文字など)はちゃんとURLデコードされているのに、"+" だけはデコードされないようなのだ。
手元の環境では、IE 6 でも IE 8 でも現象は同じ。
まぁ、これはそういうものなんでしょう、IE の仕様なんでしょう。
ということで、空白をURLエンコードするには、"+" とする以外にもうひとつ、"%20" とすることもできる。
試しに、finelame=~ に "%20" を含む文字列を指定したところ、IE 6/IE 8 でも、ちゃんと %20 は空白にデコードされて、ファイル保存ダイアログに表示された。
しかししかし。
HttpUtility.UrlEncode メソッドを使って URL エンコードしていたのだが、どうも、このメソッドは空白を "+" ではなく "%20" にエンコードできるようなオプションはないらしい。
致し方ないので、
HttpUtility.UrlEncode(fileName).Replace("+", "%20");
というように、エンコード後の文字列に対して、愚直に string.Replace メソッドで置換を行うようにした。
なんだかなー、という気がしないでもないが、これにて収めることにした。
なお、某所から教えて頂いたところでは、CodePlex 上で公開されている、
AntiXSS というライブラリを使えば、空白を "%20" で URL エンコードできるそうだ。
まだ使ったことはないが、
ソースコードを見るに、
AntiXss.UrlEncode(string)
でURLエンコードできるようなので、使い方に迷うことはなさそうだ。
こだわる向きは、AntiXSS ライブラリの採用を検討するのもよいかもしれない。