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

8

似乎没有一种被广泛接受的方法以非ASCII格式发送标头参数。

文件下载的标头通常如下所示:

Content-disposition: attachment; filename="theasciifilename.doc"

但是,如果在文件名参数中加入一个UTF8编码的字符串,Firefox将可以正常处理它,而IE则会出错。

有一篇CodeProject文档解释了一种编码文件名的方法。

这个文档将“Bản Kiểm Kê.doc”编码为“B%e1%ba%a3n%20Ki%e1%bb%83m%20K%c3%aa.doc”,即通过十六进制编码字节。

问题#1:该字符串中的第一个字符:ả的值为ả - 将该数字编码为十六进制,您将得到%a3%1e。这个人怎么得到%e1%ba%a3? (显然我在这里漏掉了一些简单的东西)

问题#2:虽然IE承认此编码,但Firefox却不承认! 该怎么办?

6个回答

8
规格基本上不允许使用除US-ASCII以外的任何内容。HTTP头是US-ASCII。HTTP的载荷默认为ISO 8859-1,但这指的是内容主体,而不是头部。
可以说正确的做法是使用MIME在标题中编码非ASCII数据的技术,如RFC 2047所述,但我不知道浏览器是否实际支持该技术。
编辑:哎呀,不,RFC 2047第5节明确说明编码形式不允许在Content-Disposition中使用。看起来你运气不好 - 没有标准。
编辑2:有一个标准 - RFC 2231定义了这应该如何工作。它得到了一些浏览器的支持,但在IE中不被支持。我发现一些测试用例展示了它的工作原理和可用的浏览器支持。

IE8(及以上版本)支持RFC 2231,所有现代浏览器都支持。唯一不认可指定文件名格式且仍然有些流行的浏览器是IE6和IE7。 - Sergiu Dumitriu
IE8不支持RFC 2231,已经测试过。另请参见http://greenbytes.de/tech/tc2231/。 - Vsevolod Golovanov

3

问题1的答案:您混淆了Unicode和UTF-8。 'ả'的十六进制值为0xA31E,但那不是一个UTF-8字符。在UTF-8中,该字符需要三个字节,0xE1 0xBA 0xA3。对于非ASCII编码,URL编码定义不太清楚,但%e1%ba%a3是该字符的有效UTF-8编码。


"UTF-8字符"这个说法是不存在的。 - user253751

2

对于问题#2,您需要对Internet Explorer和Firefox的文件名进行URL编码。唯一的区别是在Firefox中需要使用RFC 2231的格式。 这适用于Firefox 3和Internet Explorer 7。


1
在你上面提供的链接中,e1 ba a3 是所提到字符的UTF-8编码,而不是字符代码。

0

很遗憾,目前还没有一种适用于所有用户代理的单一方法。

请参见http://greenbytes.de/tech/tc2231/进行测试,然后向Microsoft、Google和Apple提出投诉。


0

关于问题#2的答案(有点):

既然你已经发现一个浏览器中的命名方案在另一个浏览器中不起作用,那么你唯一的解决方案就是为每个浏览器采用不同的方法,类似于这里的示例。

如果链接失效了,解决方案基本上是:

1. If browser is IE URL encode filename
2. Generate Content-disposition header

当然,通过用户代理(这大概是唯一的方法)确定浏览器是否为IE充满了各种常见的危险。
尽管这听起来很北美中心化,但如果在许多你无法控制的浏览器中使用此功能(这些浏览器可能已经阻止或修改了用户代理),那么最好避免在文件名中使用UTF-8编码字符,并始终使用“下载”或其他类似词语。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接