[轉] 文件下載中文顯示 content-disposition 正確設置 ---- http://hi.baidu.com/_kowalski/item/45dfa9298c79aec8dcf69ade


 

 

 

【轉】文件下載中文顯示 content-disposition 正確設置

補充: 在IE下,filename 必須保留擴展名部分(xxx.doc), 文件名中的中文才能正確解碼, 否則可能不識別%20(空格), 甚至在ie6下全部都是未解碼的格式(%xx).

另外原始的空格使用urlEncode 編碼后轉換為+號(基於歷史原因), 而ie解析時會直接作為+號處理, 因此需要手工替換一下這個特殊字符.

URLEncoder.encode("中文+   en", "UTF-8").replaceAll("\\+", "%20");

safari相對比較變態, filename部分只能使用utf-8的原始字節,而http header 必須使用單字節編碼的字符串, 因此需要將原始內容重新構造為iso-8859-1單字節編碼的字符串,即:new String(filename.getBytes("UTF-8"),"ISO8859-1") 

 

另外我用了幾個新的瀏覽器做了幾個對比測試

編碼方式  |  測試通過的瀏覽器

RFC2231 filename* |   ie9 ,chrome17 , opera11,firefox11

iso-8859-1 (utf-8):  |  chrome,opera,firefox,safari

url-encode(utf-8)  |    ie6+ (文件名必須帶擴展名), chrome\opera(%2B 加號不識別)


因此兼容規則設置為  ie: urlEncode  , opera\firefox : filename*,  safari\chrome: iso-8859-1 比較合適

 

 

-------------- 割~~~ ------------------

下面是網上找的關於content-dispositoin顯示中文問題的唯一正確的總結...  轉載自: http://java-xp.iteye.com/blog/903048 

瀏覽器能正確識別的編碼格式,只要按照這樣的編碼來設置對應的Content-Disposition,那么應該就不會出現中文文件名的亂碼問題了。 
首先,Content-Disposition值可以有以下幾種編碼格式 
1. 直接urlencode: 

    Content-Disposition: attachment; filename="struts2.0%E4%B8%AD%E6%96%87%E6%95%99%E7%A8%8B.chm" 

2. Base64編碼: 

    Content-Disposition: attachment; filename="=?UTF8?B?c3RydXRzMi4w5Lit5paH5pWZ56iLLmNobQ==?=" 

3. RFC2231規定的標准: 

    Content-Disposition: attachment; filename*=UTF-8''%E5%9B%9E%E6%89%A7.msg 

4. 直接ISO編碼的文件名: 

    Content-Disposition: attachment;filename="測試.txt" 

然后,各瀏覽器支持的對應編碼格式為: 

1.  IE瀏覽器,采用URLEncoder編碼 
2.  Opera瀏覽器,采用filename*方式 
3.  Safari瀏覽器,采用ISO編碼的中文輸出 
4.  Chrome瀏覽器,采用Base64編碼或ISO編碼的中文輸出 
5.  FireFox瀏覽器,采用Base64或filename*或ISO編碼的中文輸出 


new_filename = URLEncoder.encode(filename, "UTF8");  
// 如果沒有UA,則默認使用IE的方式進行編碼,因為畢竟IE還是占多數的  
rtn = "filename=\"" + new_filename + "\"";  
if (userAgent != null)  
{  
     userAgent = userAgent.toLowerCase();  
      // IE瀏覽器,只能采用URLEncoder編碼  
     if (userAgent.indexOf("msie") != -1)  
    {  
        rtn = "filename=\"" + new_filename + "\"";  
    }  
     // Opera瀏覽器只能采用filename*  
     else if (userAgent.indexOf("opera") != -1)  
     {  
        rtn = "filename*=UTF-8''" + new_filename;  
    }  
    // Safari瀏覽器,只能采用ISO編碼的中文輸出  
      else if (userAgent.indexOf("safari") != -1 )  
      {  
          rtn = "filename=\"" + new String(filename.getBytes("UTF-8"),"ISO8859-1") + "\"";  
      }  
      // Chrome瀏覽器,只能采用MimeUtility編碼或ISO編碼的中文輸出  
      else if (userAgent.indexOf("applewebkit") != -1 )  
       {  
         new_filename = MimeUtility.encodeText(filename, "UTF8", "B");  
          rtn = "filename=\"" + new_filename + "\"";  
       }  
      // FireFox瀏覽器,可以使用MimeUtility或filename*或ISO編碼的中文輸出  
       else if (userAgent.indexOf("mozilla") != -1)  
       {  
          rtn = "filename*=UTF-8''" + new_filename;  
      }  
   }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM