似乎没有一种可接受的方式来发送非ascii格式的头参数。
文件下载的标题通常类似于
内容 - 处理:附件;文件名= “theasciifilename.doc”
除非你在文件名参数中粉碎utf8编码的字符串,否则Firefox会处理它,而IE会抛出。
有一个document on CodeProject that explains a method for encoding the filename.
本文件将BảnKiểmKê.doc编码为B%e1%ba%a3n%20Ki%e1%bb%83m%20K%c3%aa.doc用十六进制编码字节。
问题#1:该字符串中的第一个字符:ả的值为ả - 以十六进制编码该数字,得到%a3%1e。这家伙怎么得到%e1%ba%a3? (我显然在这里遗漏了一些简单的东西)
问题#2:虽然IE承认这种编码,但Firefox却没有!怎么办?
答案 0 :(得分:8)
规格基本上不允许除US-ASCII之外的任何其他内容。 HTTP标头是US-ASCII。 HTTP的有效负载默认为ISO 8859-1,但它指的是内容正文,而不是标题。
可以说正确的事情是使用MIME的技术在头文件中编码非ASCII数据,如RFC 2047中所述,但我不知道浏览器是否真的支持它。
编辑:哎呀,不,RFC 2047第5节明确规定在Content-Disposition中不允许使用编码形式。看起来你运气不好 - 没有标准。
编辑2:有一个标准 - RFC 2231定义了现在应该如何工作。它得到了一些浏览器的支持,但IE不支持。我找到了some test cases,它展示了它的工作原理以及可用的浏览器支持。
答案 1 :(得分:3)
回答问题#1:你混淆了Unicode和UTF-8。 'ả'的十六进制值是0xA31E,但这不是UTF-8字符。在UTF-8中,该字符需要三个字节0xE1 0xBA 0xA3
。对于非ascii编码,URL编码定义不明确,但%e1%ba%a3是用于该字符的有效UTF-8编码。
答案 2 :(得分:2)
对于问题#2,您需要对Internet Explorer和Firefox的文件名进行URL编码。唯一的区别是您需要在Firefox中使用RFC 2231的格式。 这适用于Firefox 3和Internet Explorer 7.
答案 3 :(得分:1)
在您上面的链接中,e1 ba a3是所提及字符的UTF-8编码,而不是字符代码。
答案 4 :(得分:0)
回答问题#2:
由于您发现一个浏览器中的命名方案在另一个浏览器中不起作用,因此您唯一的解决方案是针对每个浏览器执行不同的操作,类似于示例here。
如果链接消失,解决方案基本上是:
1. If browser is IE URL encode filename
2. Generate Content-disposition header
当然,用户代理确定浏览器是否是IE浏览器(这是你能做到的唯一方法),充满了各种常见的危险。
正如这听起来像北美中心一样,如果在大量浏览器中这项工作很重要,你无法控制哪些用户代理被阻止或修改,那么只需避免使用UTF-8编码的字符。文件名并始终使用“下载”等。
答案 5 :(得分:0)
不幸的是,目前没有一种方法适用于所有用户代理。
有关测试用例,请参阅http://greenbytes.de/tech/tc2231/,然后向Microsoft,Google和Apple投诉。