私の質問は、 HTTPでContent-Dispositionヘッダーのfilenameパラメーターをエンコードする方法の複製です。 しかし、その質問はずっと前に行われたものであり、(私の意見では)まだ満足のいく答えがないので、もう一度質問したいと思います。
「weird#€={};filename.txt」のような名前に特殊文字を含めることができるファイルを配信するC++CGIアプリケーションを開発しています。
HTTPContent-Dispostionを次のようなすべてのブラウザで機能するように設定する可能性はないようです。
- インターネットエクスプローラ
- Firefox
- クロム
- オペラ
- サファリ
ブラウザごとに異なるソリューションがあれば幸いです。
今、それは私がどこまで来たかです:
Internet Explorer(二重引用符を追加し、#と;を置き換えました)
Content-Disposition: attachment; filename="weird %23 € = { } %3B filename.txt"
Firefox(二重引用符は機能しているようです。これ以上何もする必要はありません):
Content-Disposition: attachment; filename="weird # € = { } ; filename.txt"
別の実用的な代替手段:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
クロム
二重引用符のみを使用すると、次の問題が発生します。
- =ファイル名で消える
- €は-に置き換えられます
しかし、これは機能します:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
オペラ
二重引用符を使用するか、構文を使用すると、filename * =UTF-8''...で次の問題が発生します。
- ファイル名の複数のくっついたスペースが1つに減ります
- {および}が消える: " ab {} cd.txt "-> " abcd.txt "
- ファイル名は;の後に切り捨てられます。その中: " abc; def.txt "-> " abc "
編集2:これはファイル名の長さの制限が原因でした。この構文はOperaで機能します。
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
サファリ
€は見えない文字に置き換えられます(二重引用符を使用)
no solution that prevents that little problem
他のスレッド(上記)からの提案を使用して
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%80%20%3D%20%7B%20%7D%20%3B%20filename.txt
私のために働いていませんでした。エスケープ文字が翻訳されないか、ブラウザがcgiアプリケーションの名前でファイルに保存しようとしています。それは私のエンコーディングが間違っていたからです。私はRFC5987に従ってエンコードしませんでした。しかし、Safariはとにかくこのエンコードを使用していません。したがって、これまでのところ€文字の解決策はありません。
ところで:UTF-8コンバーターhttp://www.rishida.net/tools/conversion/
これらのテストでは、すべてのブラウザの最新バージョンを使用しました。
- Firefox 7
- Internet Explorer 9
- Chrome 15
- Opera 11.5
- Safari 5.1
PS:キーボードですべての特殊文字を試しました。このスレッドでは、問題が発生したものだけを使用しました。
編集:
また、キーボード上のすべての特殊文字(ファイル名で使用可能)を使用してファイル名を試しましたが、上記のテスト文字列の場合とは異なります。
完全なテスト文字列:
0 ! § $ % & ( ) = ` ´ { } [ ] ² ³ @ € µ ^ ° ~ + ' # - _ . , ; ü ä ö ß 9.jpg
エンコードされたテスト文字列:
0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg
この方法の使用:
Content-Disposition: attachment; filename*=UTF-8''0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg
次の結果が得られました。
- Firefoxは動作します
- Chromeは機能します
- IE:$%&()= `´{} []²³@€µ ^°〜+'#-_。、; üäöß9.jpg(最初の6文字を削除)。編集2:これはブラウザのファイル名の長さの制限が原因でした。文字列の先頭からファイル名を切り取るのが始まりです。これについては詳しく説明しませんでしたが、通常のファイル名は約200文字の長さで、エスケープシーケンスが多いファイル名は250文字より多くても250文字未満であるようです。
- オペラ:0!§$%&()= `´[]²³@€µ ^°〜+'#--_。、; üäöß9.jpg(以前のように一部の文字が欠落しています)。編集2: IEの場合と同様にOperaでもファイル名の長さの「問題」が疑われ、そこでも機能したため、テスト文字列を短くしました。
- Safariはその構文では機能しません。それは除外されました。
編集2:
これまでの状況では、構文filename * =UTF-8''filnameエスケープシーケンス"はSafariを除くすべてのブラウザで機能します。Safariに置き換えられる文字は€だけです。私はそれで生きていけると思います。ありがとう君!
編集3:ファイル名の長さ
ファイル名の長さの問題に気づきました。
- Internet Explorer:ファイル名は147文字の長さにすることができます。文字列にエスケープシーケンスが含まれていない場合は、それがファイル名の長さです。その場合、ファイル名は変わる可能性があります。結果のファイル名は147文字より短くなります。しかし、それは異なります。2つのエスケープシーケンスを使用し、ファイル名を5文字短縮し、多くのエスケープシーケンスを使用し、ファイル名を2文字短縮しました。ここでルールが見つかりませんでした。
- 他のブラウザにはその問題はないようです。ファイルシステムがファイルを処理できる場合は、ファイルを保存します。たとえば、250文字を試しましたが、ブラウザはファイル名(Chrome)を減らす必要があると言ったか、220(Opera)または210(Firefox)文字に短縮しました。ただし、Operaはファイルの終わりを切り落としました。Safariはその長いファイル名を保存しようとしましたが、保存せず、ダウンロードリストにファイル名として「-1」を書き込んでしまいました。