ブラウザのファイルダウンロードボックスに非ASCIIファイル名を表示する方法は?
質問
非ASCII形式のヘッダーパラメータを送信する方法は受け入れられていないようです。
ファイルのダウンロードのヘッダーは通常次のようになります
Content-disposition:添付; filename =" theasciifilename.doc"
filenameパラメーターでutf8エンコードされた文字列を壊した場合を除き、Firefoxはそれを適切に処理しますが、IEはスローします。
CodeProjectには、ファイル名のエンコード方法を説明するドキュメントがあります。
このドキュメントは、Bả n Kiể m Kê .docをB%e1%ba%a3n%20Ki%e1%bb%83m%20K%c3%aa.docに16進エンコードすることによりエンコードします。バイト。
問題#1:その文字列の最初の文字:ả値はảです。 -その数値を16進数でエンコードすると、%a3%1eが得られます。この男はどのようにして%e1%ba%a3を取得しましたか? (私は明らかにここで簡単なものを見逃しています)
問題#2:IEはこのエンコーディングを認識しますが、Firefoxは認識しません!何をすべきか
解決
質問#1に対する回答:UnicodeとUTF-8を混同しています。 'ả'の16進値0xA31Eですが、UTF-8文字ではありません。 UTF-8では、この文字は3バイト、 0xE1 0xBA 0xA3
を必要とします。 URLエンコーディングは非ASCIIエンコーディングに対しては不十分に定義されていますが、%e1%ba%a3はその文字に使用する有効なUTF-8エンコーディングです。
他のヒント
仕様では、基本的にUS-ASCII以外は許可されていません。 HTTPヘッダーはUS-ASCIIです。 HTTPのペイロードのデフォルトはISO 8859-1ですが、ヘッダーではなくコンテンツ本文を参照します。
間違いなく行うべきことは、 RFC 2047 ですが、ブラウザが実際にサポートしているかどうかはわかりません。
編集:おっと、RFC 2047セクション5では、エンコードされたフォームはContent-Dispositionでは許可されていないと明示的に述べています。運が悪いようです-標準はありません。
編集2:標準があります- RFC 2231 は、これが現在どのように機能するかを定義します。一部のブラウザーからサポートされていますが、IEではサポートされていません。 いくつかのテストケースを見つけました。利用可能。
問題2では、Internet ExplorerとFirefoxの両方のファイル名をURLエンコードする必要があります。唯一の違いは、FirefoxでRFC 2231の形式を使用する必要があることです。 これは、Firefox 3およびInternet Explorer 7に適用されます。
上記のリンクでは、e1 ba a3は文字コードではなく、言及された文字のUTF-8エンコードです。
問題#2への回答(並べ替え):
あるブラウザの命名スキームが他のブラウザでは機能しないことがわかったので、唯一の解決策は、例こちら。
リンクがなくなった場合の解決策は、基本的に次のとおりです。
1. If browser is IE URL encode filename
2. Generate Content-disposition header
もちろん、ブラウザがUser-agentによってIEであるかどうかを判断すること(これが唯一の方法です)は、あらゆる種類の通常の危険に満ちています。
これは北米中心なので、ユーザーエージェントをブロックまたは変更する可能性のある多数のブラウザーでこれが機能しないことが重要な場合は、単にUTF-8エンコードされた文字をファイル名を使用し、常に「ダウンロード」を使用します;または何か。
残念ながら、現在、すべてのユーザーエージェントで機能する単一の方法はありません。
テストケースについては http://greenbytes.de/tech/tc2231/ を参照してから、マイクロソフト、グーグル、アップルに文句を言う。