firefox下载文件的名称乱码问题

firefox下载文件乱码

一看题目,说的是什么鬼。且听我细细到来。

从firefox浏览器上下载了一个文件,文件名是乱码,如下:

%E9%9D%9E%E5%85%A8%E8%AE%BA%E6%96%87%E8%AF%B4%E6%98%8E%E4%BC%9A.pptx

虽然我知道下载的这个文件名叫什么,但是光重命名,对不起这个程序员的称谓。

于是乎开始了看不懂字符串的编码到看得懂的字符串的转换。

为什么会乱码

因为不同的浏览器遵守不同的标准和协议

例如,发送一个文件时,需要在HTTP header中指定文件名:

Content-Disposition: attachment; filename="test.docx"

但是HTTP规范不允许在非ascii出现在HTTP header中,所以必须将不同的语言的文件名都进行编码。

IE和Chrome都支持将文件名编码为utf-8形式,下载时在进行文件名的解码,从而避免乱码,例如

Content-Disposition: attachment; filename="%d0%a2%d0%b5%d0%ba%d1%81%d1%82.doc"

但Firefox, Opera不遵守这个标准,它们遵守的是RFC2231,RFC2231规定编码后的文件名前面需要加上编码格式

大专栏  firefox下载文件的名称乱码问题class="highlighter-rouge">

Content-Disposition: attachment; attachment;filename*=utf-8''%d0%a2%d0%b5%d0%ba%d1%81%d1%82.doc

firefox浏览器发现你filename里面指定编码格式,一律不进行解码,认为就是原本的文件名,这样你下下来的文件名就会出现乱码。

无所谓对错,个人感觉RFC2231标准有更好的扩展性。

解决掉乱码

网上的解决方案大概两种,事前预防和事后补救

方案一:

https://blog.csdn.net/bylhjcsmmd/article/details/78284736

方案二:

https://sspai.com/post/44360

https://wenku.baidu.com/view/9a75df6f561252d380eb6ea4.html

自己乱搞的

%E9%9D%9E%E5%85%A8%E8%AE%BA%E6%96%87%E8%AF%B4%E6%98%8E%E4%BC%9A.pptx

上面是我下载的乱码文件名,利用python恢复

>>> a = '%E9%9D%9E%E5%85%A8%E8%AE%BA%E6%96%87%E8%AF%B4%E6%98%8E%E4%BC%9A'
>>> b= a.replace('%','\x').lower()
>>> b
'\xe9\x9d\x9e\xe5\x85\xa8\xe8\xae\xba\xe6\x96\x87\xe8\xaf\xb4\xe6\x98\x8e\xe4\xbc\x9a'
>>> c = "b'"+b+"'"
>>> eval(x).decode('utf-8')
'非全论文说明会'

原文地址:https://www.cnblogs.com/liuzhongrong/p/12257990.html

时间: 2024-08-09 05:06:44

firefox下载文件的名称乱码问题的相关文章

在ASP.NET中,IE与Firefox下载文件带汉字名时乱码的解决方法

解决办法: HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Buffer = true; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); HttpContext.Current.Response.Charset = "gb2312"; HttpCon

.net文件压缩和解压及中文文件夹名称乱码问题

/**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博客内容 在.NET可以通过多种方式实现zip的压缩和解压:1.使用System.IO.Packaging:2.使用第三方类库:3.通过 System.IO.Compression 命名空间中新增的ZipArchive.ZipFile等类实现. 一.使用System.IO.Packaging压缩和解压

正确设置Firefox下载文件文件名的方法

不同的浏览器需要特殊设置,主要是火狐比较特殊,火狐可能给文件名加上“%0d%0a"这样的编码字符(换行的意思).不得不佩服网上的高手,这也能解决. 1 [HttpGet] 2 public FileResult Download(string id) 3 { 4 var document = service.GetDocument(id); 5 var fullName = Path.Combine(Root, document.FullName); 6 string browser = Htt

下载文件,ie文件名乱码问题

设置响应编码,将文件名用java.net.URLEncoder.encode编码,这样就不会乱码了 java.net.URLEncoder.encode response.setCharacterEncoding("UTF-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition", "attachment;f

解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题

最近做项目,采用Spring MVC做控制层,下载文件的文件名总是在主流浏览器上显示乱码,Firfox不是乱码了,IE下又成了乱码.也是烦,IE总是独树一帜,没办法,只能让程序去适应,在网上也搜索了很多,但是解决的不理想,主要是IE11作为主流浏览器后,很多人之前提出的方案都失效了. 简单来说,之前使用request获取header中的user-agent,通过MSIE关键字来判断是否是IE浏览器,如果是IE浏览器,使用utf-8对文件名编码就可以了.然而,IE11的user-agent已经没有

正确处理下载文件时HTTP头的编码问题(Content-Disposition)

转自:https://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/ 最近在做项目时遇到了一个 case :需要实现一个强制下载功能(即强制弹出下载对话框,阻止浏览器尝试解析显示某些文件格式),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可

【转】正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)

最近在做项目时遇到了一个 case :需要实现一个强制在浏览器中的下载功能(即强制让浏览器弹出下载对话框),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可以配合 Content-Type: application/octet-stream 来确保万无一失.而后一个需求就比较蛋疼了,牵扯到 Header 的编码问题(文件名是作为 filena

.NET两种常见上传下载文件方法

1.FTP模式 代码如下: (1)浏览 /// <summary> /// 浏览文件 /// </summary> /// <param name="tbControl">控件名称</param> private void ViewFile(TextBox tbControl) { OpenFileDialog openFileDialogTemp = new OpenFileDialog();//提示用户打开文件弹窗 //设置文件类型

Servlet 下载文件

服务器端有以下文件: 首先,建一个download.html页面(在点击下载的时候,将要下载的文件名传递给服务器端): 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Insert title here</title> 6 </head> 7 <body> 8 <h1>文件下载</h