質問: URLEncoder.encode("ファイル名", "UTF-8") response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + fileName); ``` 2に変更する事でChromeでもフ ァイル名の半角記号がデコードされてダウンロードされました。 ### 質問したい事 1. 該当のソースコードではUTF-8にエンコードしたファイル名をそのままダウンロードファイルに設定しているのですが、IEやChromeでダウンロードする際にファイル名がデコードされてダウンロードされるのですか?(Chromeでは半角記号はデコードされないですが) 2. 1の方法では`response.setContentType("application/octet-stream;charset=UTF-8");`でUTF-8の文字コードをしているがこれではダウンロードされるファイル名はデコードされませんでした。何故でしょうか? 3. 2の方法では`filename*=`で文字コードを指定することで半角記号ファイル名がデコードされダウンロードされましたが、なせ文字コードを指定した事でダウンロードが出来るようになったのでしょうか? 以上です。 良く分からない多く検討違いな事を聞いていたりするかもしれないですがよろしくお願い致します。
回答: `Content-Disposition`ヘッダの内容はRFC 6266で規定されていますが、制定前から`filename`引数としてASCII外の文字を送った場合の動作は実装依存となっていました(どの文字コードで解釈するかは**ブラウザ次第**でした)。 この混乱を避けるために、文字コードを明示的に指定可能な`filename*`フィールドが作られた、というような流れです。 つまり、2. については「従来の`filename=`ではファイル名の文字コードを指定する方法がなかったから」ということで、3. は「`filename*=`では文字コードを指定することも仕様に含まれているから」という結論です。