我的问题是How to encode the filename parameter of Content-Disposition header in HTTP?的副本
但是由于这个问题是很久以前提出的,而且仍然没有令人满意的答案(我认为),因此我想再次提出。
我开发了一个C++ CGI应用程序,该应用程序提供的文件名中可以包含特殊字符,例如“weird#€= {}; 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
Chrome
当仅使用双引号时,会出现以下问题:
但这有效:
Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt
歌剧
使用双引号或使用语法: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
苹果浏览器
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
我得到以下结果:
编辑2:
到目前为止,状态是,文件名* = UTF-8''filname escape sequence”可以在除Safari之外的所有浏览器上使用。唯一可以被Safari替换的字符是€。我想我可以接受。您!
编辑3:文件名长度
我注意到一些文件名长度问题。
最佳答案
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)。
测试案例位于:
http://greenbytes.de/tech/tc2231/#attwithfn2231utf8
关于c++ - 内容处置文件名中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7967079/