熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

PHP下載文件名亂碼問題詳解

2013-11-15 12:42:34  來源: PHP編程 

  通過把ContentType設置為application/octetstream可以把動態生成的內容當作文件來下載相信這個大家都會那麼用ContentDisposition設置下載的文件名這個也有不少人知道吧基本上下載程序都是這麼寫的

 header(ContentDisposition: attachment; filename= $filename);print Hello!;?> 


  這樣用浏覽器打開之後就可以下載documenttxt

  但是如果$filename是UTF編碼的有些浏覽器就無法正常處理了比如把上面那個程序稍稍改一下

 header(ContentDisposition: attachment; filename= $filename);print Hello!;?>  

  把程序保存成UTF編碼再訪問IE下載的文件名就會亂碼 FF下下載的文件名就只有中文兩個字Opera 下一切正常

  輸出的header實際上是這樣子

ContentDisposition: attachment; filename=中文 文件名txt

  其實按照RFC的定義多語言編碼的ContentDisposition應該這麼定義

ContentDisposition: attachment; filename*=utf%E%B%AD%E%%%%E%%%E%BB%B%E%%Dtxt

  即

  filename後面的等號之前要加 * filename的值用單引號分成三段分別是字符集(utf)語言(空)和urlencode過的文件名 最好加上雙引號否則文件名中空格後面的部分在Firefox中顯示不出來 注意urlencode的結果與php的urlencode函數結果不太相同php的urlencode會把空格替換成+而這裡需要替換成%

  經過試驗發現幾種主流浏覽器的支持情況如下

IE attachment; filename=

FF attachment; filename=UTF文件名

attachment; filename*=utf

O attachment; filename=UTF文件名

  Safari(Win) 貌似不支持?上述方法都不行

  這樣看來程序必須得這樣寫才能支持所有主流浏覽器

  $encoded_filename = urlencode($filename);$encoded_filename = str_replace(+ %

$encoded_filename);header(ContentType: application/octetstream);

if (preg_match(/MSIE/ $ua)) { header(ContentDisposition: attachment;

filename= $encoded_filename );} else if (preg_match(/Firefox/ $ua))

{ header(ContentDisposition: attachment; filename*=utf\\ $filename );}

 else { header(ContentDisposition: attachment; filename= $filename );}print ABC;?>

 


From:http://tw.wingwit.com/Article/program/PHP/201311/21454.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.