文档章节

不同浏览器上中文文件名的下载问题

seth_y
 seth_y
发布于 2014/04/02 10:41
字数 451
阅读 671
收藏 2

浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的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;  
      }  
   }  

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

本文转载自:http://java-xp.iteye.com/blog/903048

seth_y
粉丝 2
博文 22
码字总数 6005
作品 0
成都
高级程序员
私信 提问
Nodejs下载文件文件名中文乱码问题解决方案

最近在使用Nodejs导出下载文件时,遇到了中文文件名乱码问题,于是Google搜索+验证得出以下解决方案: var filename = 'Nodejs中文指南.pdf'; var userAgent = (req.headers['user-agent'] '......

山哥
2013/11/30
4.3K
2
response.setHeader()的用法 (转别人转的)

response.setHeader()下载中文文件名乱码问题 收藏 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cac...

yifon
2014/04/19
139
0
response.setHeader()下载中文文件名乱码问题

HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma 主要: Cache-Control , Connection , Data , Pragma , Trailer , ...

Dicky
2011/10/25
1K
0
Servlet常见乱码及解决办法

内容概要: 1.数据库乱码 2.控制台乱码 3.html网页乱码 4.下载文件文件名乱码 准备工作 1.查询"中国"的编码表:常见的中文编码表有和 2.建数据库 数据库结构 3. 制作带表单的网页,提交表单到中...

lkee6760
2017/03/01
0
0
在PHP下载文件名中解决乱码

通过把Content-Type设置为application/octet-stream, 可以把动态生成的内容当作文件来下载,相信这个大家都会。 那么用Content-Disposition设置下载的文件名, 这个也有不少人知道吧。 基本...

小宏的爹
2012/10/10
113
0

没有更多内容

加载失败,请刷新页面

加载更多

VUE- 引用视频组件

安装依赖 cnpm install vue-video-player -S cnpm install video.js -S 全局引用: 在main.js中 import VuevideoPlayer from 'vue-video-player';import 'video.js/dist/video-js.css......

流石一刻
16分钟前
2
0
树基础知识

1.树的定义(递归方式定义) 一棵树是一些节点的集合。这个集合可以是空集;若不是空集,则树由称作根(root)的节点r以及0个或多个非空的(子)树T1,T2,...Tk组成,这些子树中每一棵的跟都...

贾峰uk
18分钟前
1
0
Mockito 2 参数匹配器

Mockito 通过使用 equals() 这种自然的 Java 样式来校验参数值。有时候,当需要有其他一些灵活性的时候,你可能会要求使用参数匹配(argument matchers)。 请参考下面的代码: //stubbing u...

honeymoose
19分钟前
2
0
js中将字符串转换成json的三种方式

使用ajax的开发项目过程中,经常需要将json格式的字符串返回到前端,前端解析成js对象(JSON )。 ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5) 中JSON的概念被正式引入了...

物种起源-达尔文
34分钟前
6
0
centos7下面python3.7安装

我这里使用的是CentOS7,默认系统自带python2.7的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的...

chenhongjiang
40分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部