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')
'非全论文说明会'

你可能感兴趣的:(firefox下载文件的名称乱码问题)