我正在使用HTML标头来发现我应该下载的远程文件的文件名。因为我是德国人,一些文件包含非ASCII字符,如ä,ü或ö。在终端调试输出以及磁盘上的文件名中,这些都没有正确显示。
我正在获取这样的标题属性:
url = urlparse(urltext)
req = urllib.request.Request(url.geturl(), self.binary_data)
filename = urllib.request.urlopen(req).getheader("Content-Disposition")
我正在保存文件:
urllib.request.urlretrieve(url.geturl(), path)
在磁盘上,文件名如下所示: “Büroarbeitsplätze.pdf”代替“Büroarbeitsplätze.pdf”
感谢您的回答!
编辑:
第二个代码段中的路径是第一个示例中的文件名字符串的子字符串:path = filename.split("\"")[1]
答案 0 :(得分:0)
Content-Disposition
filename
标头参数在历史上未明确指定且对于非ASCII字符不可靠。
您正在与之通话的服务器向您发送了编码为UTF-8字节的文件名。 urllib
,解析标题,决定将其视为ISO-8859-1。没有办法知道正确的编码是什么 - 一些浏览器和工具会犯同样的错误(或其他)。
您可以通过将字符串编码回原始字节并使用您想要的编码重新解码来挽救此特定情况的情况:
>>> 'Büroarbeitsplätze.pdf'.encode('iso-8859-1').decode('utf-8')
'Büroarbeitsplätze.pdf'
但是,无法保证这对其他可能正在使用文件名编码执行其他操作的服务器有效。在世界开始转向新标准(RFC 6266)之前,这将继续成为一个不稳定和悲伤的领域。