首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 下載檔案名亂碼問題完整解決方案

     編輯:PHP 綜合知識

問題背景

透過 Content-Type: application/octet-stream 讓動態內容作檔案下載,用 Content-Disposition 設定檔名。基本寫法:

header('Content-Disposition: attachment; filename=' . $filename);

但若 $filename 為 UTF-8 編碼,部分瀏覽器無法正常處理。儲存為 UTF-8 後:IE6 亂碼、FF3 只顯示「中文」兩字、Opera 9 正常。

RFC2231 標準寫法

Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"
  • filename 後等號前加 *
  • 值用單引號分三段:字元集 (utf8)、語言 (空)、urlencode 後檔名
  • 最好加雙引號,否則 Firefox 空格後內容不顯示
  • 注意 urlencode 與 PHP urlencode() 不同:PHP 空格編為 +,此處需編為 %20

瀏覽器支援情況

  • IE6:attachment; filename=""
  • FF3:attachment; filename="UTF-8檔名" 和 attachment; filename*="utf8''"
  • Opera 9:attachment; filename="UTF-8檔名"
  • Safari 3 (Win):似不支援上述方法

相容所有主流瀏覽器的寫法

$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
header('Content-Type: application/octet-stream');
$ua = $_SERVER['HTTP_USER_AGENT'];
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; filename="' . $filename . '"');
}
print 'ABC';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved