如何解码Content的文件名参数

这个问题提供了这个filename参数的背景。

我需要编写一个脚本来访问Web服务器上的一些文件。 文件名包含不能用ASCII编码的CJK字符。

$ curl -I 'http://bj.baidupcs.com/file/f6f258963f3c5daaa154ed441db232e1?xcode=f5a142e99df965f6a3b4c502a3c55a73283ef282da2f5c14&fid=1107408242-250528-2625488475&time=1373046574&sign=FDTAXER-DCb740ccc5511e5e8fedcff06b081203-QSIMrWw%2FICWQuExpdtyijM0vbMM%3D&to=bb&fm=N,Q,U&expires=8h&rt=sh&r=210487178&logid=3893215518&sh=1'
......
Content-Disposition: attachment;filename="【动漫之家汉化组】[最强会长黑神][第192话][黑神目泷依然健在][END].zip"
......

如你所见,cURL正确解码文件名。 Firefox也可以找出正确的文件名。

我用Python编写了我的脚本。 我先尝试requests

>>> import requests
>>> r=requests.head('http://bj.baidupcs.com/file/f6f258963f3c5daaa154ed441db232e1?xcode=f5a142e99df965f6a3b4c502a3c55a73283ef282da2f5c14&fid=1107408242-250528-2625488475&time=1373046574&sign=FDTAXER-DCb740ccc5511e5e8fedcff06b081203-QSIMrWw%2FICWQuExpdtyijM0vbMM%3D&to=bb&fm=N,Q,U&expires=8h&rt=sh&r=210487178&logid=3893215518&sh=1')
>>> r.headers['content-disposition']
'attachment;filename="ãx80x90åx8a¨æ¼«ä¹x8b家æ±x89åx8cx96ç»x84ãx80x91[æx9cx80强ä¼x9aéx95¿é»x91ç¥x9e][第192è¯x9d][é»x91ç¥x9eçx9b®æ³·ä¾x9dçx84¶åx81¥åx9c¨][END].zip"'

文件名看起来像是一个奇怪的Python字节表示。 问题是,这整个事情已经是一个Python字符串。 我想不出解决实际字节的方法。

>>> type(r.headers['content-disposition'])
<class 'str'>

底层的库requests使用的是http.client标准库。 我试了一下,但得到了同样的结果:

>>> import http.client
>>> conn = http.client.HTTPConnection("bj.baidupcs.com")
>>> conn.request('HEAD', '/file/f6f258963f3c5daaa154ed441db232e1?xcode=f5a142e99df965f6a3b4c502a3c55a73283ef282da2f5c14&fid=1107408242-250528-2625488475&time=1373046574&sign=FDTAXER-DCb740ccc5511e5e8fedcff06b081203-QSIMrWw%2FICWQuExpdtyijM0vbMM%3D&to=bb&fm=N,Q,U&expires=8h&rt=sh&r=210487178&logid=3893215518&sh=1')
>>> r=conn.getresponse()
>>> r.getheader('content-disposition')
'attachment;filename="ãx80x90åx8a¨æ¼«ä¹x8b家æ±x89åx8cx96ç»x84ãx80x91[æx9cx80强ä¼x9aéx95¿é»x91ç¥x9e][第192è¯x9d][é»x91ç¥x9eçx9b®æ³·ä¾x9dçx84¶åx81¥åx9c¨][END].zip"'

我在Windows上使用Python 3。


看起来你正在获得一个UTF8编码(字节)字符串作为Python 3(Unicode)字符串。 你必须做一些像......

>>> s = 'attachment;filename="ãx80x90åx8a¨æ¼«ä¹x8b家æ±x89åx8cx96ç»x84ãx80x91[æx9cx80强ä¼x9aéx95¿é»x91ç¥x9e][第192è¯x9d][é»x91ç¥x9eçx9b®æ³·ä¾x9dçx84¶åx81¥åx9c¨][END].zip"'
>>> s = s.encode('latin-1').decode('utf-8')
>>> s
'attachment;filename="【动漫之家汉化组】[最强会长黑神][第192话][黑神目泷依然健在][END].zip"'
链接地址: http://www.djcxy.com/p/22165.html

上一篇: How to decode the filename parameter of Content

下一篇: Java servlet download filename special characters