内容中的特殊字符

这个线程是如何在HTTP中编码Content-Disposition头文件名参数的重复内容? 但由于这个问题很久以前就被问过了,但仍然没有令人满意的答案(在我看来),我想再问一次。

我开发了一个C ++ CGI应用程序,它提供了可以在名称中包含特殊字符的文件
“怪异#€= {}; filename.txt”

似乎没有可能将HTTP Content-Dispostion设置为适用于所有浏览器的方式

  • IE浏览器
  • 火狐
  • 歌剧
  • 苹果浏览器
  • 我会很高兴为每个浏览器提供不同的解决方案。
    现在,我来了多远:

    Internet Explorer(添加双引号并替换#和;)

    Content-Disposition: attachment; filename="weird %23 € = { } %3B filename.txt"
    

    火狐浏览器(双引号似乎工作,没有更多的事情要做):

    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''...会产生以下问题:

  • 文件名中多个粘贴在一起的空格会减少为一个
  • {和} disapear:“ab {} cd.txt” - >“abcd.txt”
  • 文件名被截断后; 在它中:“abc; def.txt” - >“abc”
  • 编辑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仍然没有使用这种编码。 所以迄今为止还没有解决欧元的问题。

    顺便说一句:一个UTF-8转换器http://www.rishida.net/tools/conversion/

    我使用这些测试的每个浏览器的最新版本:

  • Firefox 7
  • Internet Explorer 9
  • Chrome 15
  • Opera 11.5
  • Safari 5.1
  • 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
    

    我有以下结果:

  • Firefox的作​​品
  • Chrome的作品
  • IE:$%&()=`'{} []²³@μμ^°〜+'# - _。 ,; üäöß9.jpg(删除前6个字符)。 编辑2:这是因为浏览器的文件名长度限制。 它开始从字符串的开头切断文件名。 我没有深入研究,但它看起来像普通的文件名可以是大约200个字符长,文件名与许多逃生sequesnces甚至更多但少于250.但没关系。
  • 歌剧:0! §$%&()=`'[]²³@μμ^°〜+'# - _。 ,; üäöß9.jpg(像以前一样缺少一些字符)。 编辑2:我缩短了我的测试字符串,因为我怀疑Opera的文件名长度“问题”与IE一样,并且它也在那里工作。
  • Safari无法使用该语法。 那是例外。
  • 编辑2:

    目前状态是,语法文件名* = UTF-8'filname转义序列“适用于除Safari之外的所有浏览器,唯一被Safari取代的字符是€。我想我可以忍受这一点。您!

    编辑3:文件名的长度

    我注意到一些文件名长度问题。

  • Internet Explorer:文件名可以是147个字符。 如果字符串不包含转义序列,那么这就是文件名的长度。 如果它确实可以改变文件名称。 生成的文件名称短于147个字符。 但它有所不同。 我使用了2个转义序列,文件名缩短了5个字符,我使用了许多转义序列,文件名缩短了onyl 2个字符。 我在这里找不到规则。
  • 其他浏览器似乎没有这个问题。 如果文件系统可以处理文件,他们会保存该文件。 我尝试了250个字符,浏览器说我必须减少文件名(Chrome),或者他们自己缩短为220(Opera)或210(Firefox)字符。 Opera截断了虽然结束的文件。 Safari试图保存这个长文件名,最终没有保存它,并在下载列表中将“-1”作为文件名。

  • 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

    链接地址: http://www.djcxy.com/p/22161.html

    上一篇: Special Characters in Content

    下一篇: The underlying connection was closed: An unexpected error occurred