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