不同浏览器上中文文件名的下载乱码问题
2011-09-09 16:43
浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的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 = de(filename, "UTF8"); 
// 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的 
rtn = "filename=\"" + new_filename + "\""; 
if (userAgent != null) 

    userAgent = LowerCase(); 
      // 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 Bytes("UTF-8"),"ISO8859-1") + "\""; 
      } 
      // Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出 
      else if (userAgent.indexOf("applewebkit") != -1 ) 
      { 
        new_filename = deText(filename, "UTF8", "B"); 
          rtn = "filename=\"" + new_filename + "\""; 
      } 
      // FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出 
      else if (userAgent.indexOf("mozilla") != -1) 
      { 
dtnl教学课件维密秀正式宣布取消          rtn = "filename*=UTF-8''" + new_filename; 
      } 
新年祝福贺词四个字  } 

目前,我测试的情况,在几个浏览器上都能正常输入中文文件名 
但,也许浏览器不同版本,可能还会有乱码的情况.....
 
hi.baidu/laxinicer/blog/item/f755d82e538a70474ec22634.html