Rocho.J

人脑是不可靠的, 随时记录感悟并且经常重复!

 

[转] 文件下载中文显示 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;  
      }  
   }  

posted on 2012-09-24 12:16  RJ  阅读(9241)  评论(0编辑  收藏  举报

导航