【问题标题】:Cannot resolve encoding of filename in HTTP response headers无法解析 HTTP 响应标头中的文件名编码
【发布时间】:2021-08-14 15:06:15
【问题描述】:

我正在尝试使用 urrlib.request 在 Python 中发出 HTTP 请求:

import urllib.request
url = 'https://www.example.com/pdf/123'
request = urllib.request.urlopen(url)
headers = request.getheaders()

当尝试打印标题时,输出包括使用西里尔文但编码错误的文件名:

('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 响应标头中正确显示文件名?

【问题讨论】:

  • 检查response.encoding,必要时设置response.encoding = 'utf-8'
  • @JosefZ 在 urllib 库 HTTPResponse 没有属性“编码”。尝试使用 requests 模块时,response.encoding 为 None 并将其设置为 utf-8 或任何其他编码没有任何改变。

标签: python encoding request http-headers urllib


【解决方案1】:

想通了。将标头返回的字符串编码为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;'

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2023-03-18
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多