Python IE 11不';无法正确解析HTTP内容处置头

Python IE 11不';无法正确解析HTTP内容处置头,python,utf-8,internet-explorer-11,content-disposition,Python,Utf 8,Internet Explorer 11,Content Disposition,在IE 11中执行文件下载时,我试图将内容处置头设置为获取自定义文件名 我在IE 11中遇到了极其奇怪的行为:当内容处理头的文件名中存在转义(U+001B)字符时,IE 11无法设置正确的文件名(在内容处理头中提供)。例如,content\u disposition使用格式化的文件名\u 1触发IE 11错误,但使用文件名\u 2格式化是可以的: # There are invisible control character escape (U+001B) name = u'_$B!' file

在IE 11中执行文件下载时,我试图将内容处置头设置为获取自定义文件名

我在IE 11中遇到了极其奇怪的行为:当内容处理头的文件名中存在转义(U+001B)字符时,IE 11无法设置正确的文件名(在内容处理头中提供)。例如,
content\u disposition
使用格式化的
文件名\u 1
触发IE 11错误,但使用
文件名\u 2
格式化是可以的:

# There are invisible control character escape (U+001B)
name = u'_$B!'
file_name_1 = quote(name) # gives "_%1B%24B%21"
file_name_2 = "_%24B%21.pdf"
content_disposition = "attachment; filename*=utf-8''%s" % file_name_2
是否有任何方法可以支持IE11中的任何utf8文件名


注意:在所有其他浏览器中,一切似乎都正常工作,我希望有办法在不破坏其他浏览器的情况下修复IE 11的行为…

不接受此类字符实际上是规范建议的。见:

收件人应删除或替换已知会导致用户界面和文件名混淆的字符序列,如控制字符、前导和尾随空格


当然,人们可能会争论保留剩余字符会有什么好处,但重要的一点是建议用户代理剥离控制字符。

建议在形成内容处置头之前剥离控制字符(更多信息请参见@JulianReschke answer)

在python中,可以使用和轻松剥离:


我不明白-为什么一开始就希望文件名中有一个不可见的字符?这可能是某种安全过滤器。@Pekka웃 位置无关紧要%1B可能在文件名中的任何位置,问题是如果存在%1B,则会错误显示文件名。此外,我无法控制将作为文件名的数据。在IE11中,您将获得什么文件名?@Pekka웃 文件名总是有不同的值(我猜这取决于文件下载url,因为它是动态的),例如“afdCddNN%2BYK99Notq33ZzzDCiO9ngVJzYbNj1vV5bn9HlO90oSSTk0o7ermuKK%3D”@Pekka웃 谢谢你的帮助,谢谢你对过滤器的建议。我决定在形成内容处置之前剥离所有控制代码字符。你是对的,如果我没有其他选择,我很可能会剥离控制字符
# There are invisible control character escape (U+001B)
name = u'_$B!'
# All chars with ord(s) <= 31 is a control characters.
name = "".join(i for i in name if ord(i) > 31)
name = u'_$B!'
# Strip control codes
name = "".join(i for i in name if ord(i) > 31)

file_name_1 = quote(name) # gives "_%1B%24B%21"
file_name_2 = "_%24B%21.pdf"
content_disposition = "attachment; filename*=utf-8''%s" % file_name_2