Content-Type を application/octet-stream に設定すると、動的に生成されたコンテンツをファイルとしてダウンロードできることは誰もが知っていると思います。次に、Content-Disposition を使用して、ダウンロードしたファイル名を設定します。これは多くの人が知っています。基本的に、ダウンロード プログラムは次のように記述されます:
<?php$filename = “document.txt”;header('Content-Type: application/octet-stream');header('Content-Disposition:attachment; filename=' 。 $filename);print “Hello!”;?>ブラウザで開くと、document.txt をダウンロードできます。
ただし、$filename が UTF-8 でエンコードされている場合、一部のブラウザではそれを適切に処理できません。たとえば、上記のプログラムを少し変更します:
<?php$filename = "中国語のファイル名.txt";header('Content-Type: application/octet-stream');header('Content-Disposition:attachment; filename=' . $filename);print “Hello!”;?> UTF-8 で保存してアクセスすると、IE6 でダウンロードしたファイル名が文字化けします。 FF3でダウンロードしたファイル名には「中国語」という単語しか入っていません。 Opera 9 ではすべて正常に動作します。
実際の出力ヘッダーは次のようになります:
Content-Disposition:attachment; filename=中国語のファイル名.txt 実際、RFC2231 の定義によれば、多言語エンコーディング Content-Disposition は次のように定義される必要があります:
Content-Disposition:attachment ; filename*=”utf8 "%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" は、
等号の前に * を追加すること
を意味します。ファイル名の後に
filename の値は、一重引用符で囲まれた 3 つのセグメント、つまり文字セット (utf8)、言語 (空)、および URL コード化されたファイル名に分割されます。
二重引用符を追加することをお勧めします。そうしないと、ファイル名のスペースの後の部分が Firefox で表示されなくなります。urlencode の結果は、PHP の urlencode 関数の結果と同じではないことに注意してください。 +、ここでは %20 に置き換える必要があります
テストの結果、いくつかの主流ブラウザのサポートは次のとおりであることがわかりました。
IE6attachment filename="<URL エンコード後の UTF-8 ファイル名>"
FF3 添付ファイル名 = "UTF-8 ファイル名"
添付ファイル; filename*=”utf8”<URL エンコード後の UTF-8 ファイル名>”
O9 添付ファイル名 = "UTF-8 ファイル名"
Safari3(Win)はサポートされていないようですね?上記の方法はいずれも機能しません
。すべての主流ブラウザをサポートするには、プログラムを次のように記述する必要があるようです:
<?php$ua = $_SERVER["HTTP_USER_AGENT"];$filename = "中国語のファイル名.txt";$encoded_filename = urlencode( $filename);$encoded_filename = str_replace("+", "%20", $encoded_filename);header('Content-Type: application/octet-stream');if (preg_match("/MSIE/", $ua) ) { header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');} else if (preg_match("/Firefox/", $ua)) { header('Content-Disposition : 添付ファイル名*=”utf8'” . $ファイル名 . '"');} else { header('Content-Disposition: 添付ファイル; ファイル名=”' . $ファイル名 . '"');}print 'ABC ';?>