无法解析 HTTP 响应中的文件名编码 headers
Cannot resolve encoding of filename in HTTP response headers
我正在尝试使用 urrlib.request 在 Python 中发出 HTTP 请求:
import urllib.request
url = 'https://www.example.com/pdf/123'
request = urllib.request.urlopen(url)
headers = request.getheaders()
当尝试打印 headers 时,输出包括使用西里尔语言但编码错误的文件名:
('Content-Disposition', 'attachment; filename="Ð\x9fÑ\x80о наÑ\x83к-доÑ\x81л Ñ\x81емÑ\x96наÑ\x80.pdf"; modification-date="Thu, 12 May 2016 01:48:56 +0300"; size=57814;')
这可能与默认设置的二进制编码有关,因为 HTTp 响应是 PDF 文件,但我可能是错的。此外,尝试通过浏览器下载该文件,并且文件名以没有 mojibake 的西里尔语言正确显示和保存:Про наук-досл семінар.pdf
.
所以,我猜,"Ð\x9fÑ\x80о наÑ\x83к-доÑ\x81л Ñ\x81емÑ\x96наÑ\x80"
对应于 "Про наук-досл семінар"
。
如何让 Python 在 HTTP 响应 headers 中正确显示文件名?
想通了。将 headers 返回的字符串编码为 latin-1,然后将其解码为 utf-8 对我有用。
输入:
headers[6][1]
输出:
'attachment; filename="Ð\x9fÑ\x80о наÑ\x83к-доÑ\x81л Ñ\x81емÑ\x96наÑ\x80.pdf"; modification-date="Thu, 12 May 2016 01:48:56 +0300"; size=57814;'
输入:
headers[6][1].encode('latin1')
输出:
b'attachment; filename="\xd0\x9f\xd1\x80\xd0\xbe \xd0\xbd\xd0\xb0\xd1\x83\xd0\xba-\xd0\xb4\xd0\xbe\xd1\x81\xd0\xbb \xd1\x81\xd0\xb5\xd0\xbc\xd1\x96\xd0\xbd\xd0\xb0\xd1\x80.pdf"; modification-date="Thu, 12 May 2016 01:48:56 +0300"; size=57814;'
输入:
headers[6][1].encode('latin1').decode('utf-8')
输出:
'attachment; filename="Про наук-досл семінар.pdf"; modification-date="Thu, 12 May 2016 01:48:56 +0300"; size=57814;'
我正在尝试使用 urrlib.request 在 Python 中发出 HTTP 请求:
import urllib.request
url = 'https://www.example.com/pdf/123'
request = urllib.request.urlopen(url)
headers = request.getheaders()
当尝试打印 headers 时,输出包括使用西里尔语言但编码错误的文件名:
('Content-Disposition', 'attachment; filename="Ð\x9fÑ\x80о наÑ\x83к-доÑ\x81л Ñ\x81емÑ\x96наÑ\x80.pdf"; modification-date="Thu, 12 May 2016 01:48:56 +0300"; size=57814;')
这可能与默认设置的二进制编码有关,因为 HTTp 响应是 PDF 文件,但我可能是错的。此外,尝试通过浏览器下载该文件,并且文件名以没有 mojibake 的西里尔语言正确显示和保存:Про наук-досл семінар.pdf
.
所以,我猜,"Ð\x9fÑ\x80о наÑ\x83к-доÑ\x81л Ñ\x81емÑ\x96наÑ\x80"
对应于 "Про наук-досл семінар"
。
如何让 Python 在 HTTP 响应 headers 中正确显示文件名?
想通了。将 headers 返回的字符串编码为 latin-1,然后将其解码为 utf-8 对我有用。
输入:
headers[6][1]
输出:
'attachment; filename="Ð\x9fÑ\x80о наÑ\x83к-доÑ\x81л Ñ\x81емÑ\x96наÑ\x80.pdf"; modification-date="Thu, 12 May 2016 01:48:56 +0300"; size=57814;'
输入:
headers[6][1].encode('latin1')
输出:
b'attachment; filename="\xd0\x9f\xd1\x80\xd0\xbe \xd0\xbd\xd0\xb0\xd1\x83\xd0\xba-\xd0\xb4\xd0\xbe\xd1\x81\xd0\xbb \xd1\x81\xd0\xb5\xd0\xbc\xd1\x96\xd0\xbd\xd0\xb0\xd1\x80.pdf"; modification-date="Thu, 12 May 2016 01:48:56 +0300"; size=57814;'
输入:
headers[6][1].encode('latin1').decode('utf-8')
输出:
'attachment; filename="Про наук-досл семінар.pdf"; modification-date="Thu, 12 May 2016 01:48:56 +0300"; size=57814;'