如何在浏览器的文件下载框中显示非ascii文件名?

时间:2008-09-29 15:02:10

标签: encoding utf-8

似乎没有一种可接受的方式来发送非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却没有!怎么办?

6 个答案:

答案 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投诉。