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