使用 Content-Disposition: attachment; filename=... 指定下載檔名時,若檔名包含中文(UTF-8),各瀏覽器處理方式不一:IE6 亂碼、Firefox 3 截斷、Opera 9 正常、Safari 3 不支援。需依 RFC 2231 與瀏覽器實際行為實作相容方案。
| 瀏覽器 | 支援的 Header 格式 |
|---|---|
| IE6 | filename="URL編碼後的UTF-8檔名" |
| Firefox 3 | filename="UTF-8檔名" 或 filename*="utf8''URL編碼後的UTF-8檔名" |
| Opera 9 | filename="UTF-8檔名" |
| Safari 3 (Win) | 上述皆不支援 |
Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"
filename* 星號表示編碼版本%20,而非 PHP urlencode() 的 +<?php
$ua = $_SERVER['HTTP_USER_AGENT'];
$filename = '中文 檔名.txt';
$encoded = str_replace('+', '%20', urlencode($filename));
header('Content-Type: application/octet-stream');
if (preg_match('/MSIE/', $ua)) {
// IE: filename + URL 編碼
header("Content-Disposition: attachment; filename=\"{$encoded}\"");
} elseif (preg_match('/Firefox/', $ua)) {
// Firefox: RFC 2231 格式
header("Content-Disposition: attachment; filename*=\"utf8''{$encoded}\"");
} else {
// 其他: 直接 UTF-8
header("Content-Disposition: attachment; filename=\"{$filename}\"");
}
echo 'File content...';
?>
Content-Disposition: attachment; filename*=UTF-8''... 單一格式,主流瀏覽器(Chrome、Firefox、Edge、Safari 10+)均已支援。