此帖子与How to encode the filename parameter of Content-Disposition header in HTTP?重复 但是,由于很久以前就提出这个问题并且仍然没有令人满意的答案(在我看来),我想再问一次。
我开发了一个C ++ CGI应用程序,它提供的文件可以在其名称中包含特殊字符,例如“怪异的#€= {}; filename.txt ”
似乎没有可能以适合每个浏览器的方式设置HTTP Content-Dispostion,如
我会为每个浏览器提供不同的解决方案。
现在我走了多远:
Internet Explorer (添加双引号并替换#和;)
Content-Disposition: attachment; filename="weird %23 € = { } %3B filename.txt"
Firefox (双引号似乎有用。无需再做了):
Content-Disposition: attachment; filename="weird # € = { } ; filename.txt"
另一种可行的替代方案:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
浏览器
当仅使用双引号时会出现这些问题:
但这有效:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
戏
使用duoble引号或使用语法:filename * = UTF-8''...会产生以下问题:
编辑2:这是因为文件名长度限制。此语法适用于Opera:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
的Safari
€将被一个隐形字符(使用双引号)替换
no solution that prevents that little problem
来自另一个主题(如上所述)使用
的建议Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%80%20%3D%20%7B%20%7D%20%3B%20filename.txt
对我不起作用。转义字符不会被翻译回来,或者浏览器想要保存到具有我的cgi应用程序名称的文件。那是因为我的编码错了。我没有根据RFC 5987进行编码。但是Safari无论如何都没有使用这种编码。所以到目前为止还没有解决这个角色的问题。
BTW:UTF-8转换器http://www.rishida.net/tools/conversion/
我在这些测试中使用了每个浏览器的最新版本:
PS:我在键盘上尝试了所有特殊字符。我在这个帖子中只使用了那些制造麻烦的东西。
我还尝试了一个包含键盘上所有特殊字符的文件名(可以在文件名中使用),并且不像上面的测试字符串那样工作:
完成测试字符串:
0 ! § $ % & ( ) = ` ´ { } [ ] ² ³ @ € µ ^ ° ~ + ' # - _ . , ; ü ä ö ß 9.jpg
编码测试字符串:
0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg
使用此方法:
Content-Disposition: attachment; filename*=UTF-8''0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg
我得到了以下结果:
到目前为止的状态是,语法 filename * = UTF-8''filname转义序列“适用于除Safari之外的所有浏览器。并且唯一被Safari取代的字符是€我想我可以忍受。谢谢!
我发现了一些文件名长度问题。
答案 0 :(得分:11)
Firefox,MSIE(从第9版开始),Opera,Konq和Chrome支持; MSIE8和Safari不支持;其他支持是未知的 - RFC 5987中定义的编码。
请注意
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%80%20%3D%20%7B%20%7D%20%3B%20filename.txt
你得到了欧元字符的编码错误;它的unicode代码点不是%80,修复它应该使它在除Safari之外的任何地方工作(正确的编码是%e2%82%ac)。
测试案例: