8

似乎没有一种可接受的方式以非 ascii 格式发送标头参数。

文件下载的标头通常看起来像

内容配置:附件;文件名="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 不承认!该怎么办?

4

6 回答 6

8

规范基本上不允许除 US-ASCII 之外的任何内容。HTTP 标头是 US-ASCII。HTTP 的负载默认为 ISO 8859-1,但它指的是内容正文,而不是标头。

可以说,正确的做法是使用 MIME 的技术在标头中编码非 ASCII 数据,如RFC 2047中所述,但我不知道浏览器是否真的支持这一点。

编辑:哎呀,不,RFC 2047 第 5 节明确表示 Content-Disposition 中不允许编码形式。看起来你不走运 - 没有标准。

编辑 2:有一个标准 - RFC 2231定义了现在应该如何工作。它得到了一些浏览器的支持,但在 IE 中不受支持。我发现了一些测试用例,它们展示了它的工作原理以及可用的浏览器支持。

于 2008-09-29T22:45:16.727 回答
3

对问题 #1 的回答:您混淆了 Unicode 和 UTF-8。'ả' 的十六进制值是 0xA31E 但这不是 UTF-8 字符。在 UTF-8 中,该字符需要三个字节,0xE1 0xBA 0xA3. URL 编码对于非 ascii 编码的定义很差,但 %e1%ba%a3 是用于该字符的有效 UTF-8 编码。

于 2008-09-29T15:18:06.020 回答
2

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

于 2008-11-04T00:07:04.203 回答
1

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

于 2008-09-29T15:10:24.463 回答
0

对问题 #2 的回答(某种程度上):

由于您发现一个浏览器中的命名方案在另一个浏览器中不起作用,您唯一的解决方案是对每个浏览器进行不同的处理,类似于此处的示例。

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

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

当然,通过 User-agent 确定浏览器是否为 IE(这是您可以做到的唯一方法)充满了各种常见的危险。

就像这听起来以北美为中心一样,如果在您无法控制的大量浏览器中这项工作很重要,哪些浏览器可能会阻止或修改用户代理,那么只需避免文件名中的 UTF-8 编码字符并始终使用“下载”之类的。

于 2008-09-29T16:37:32.490 回答
0

不幸的是,目前没有一种方法可以在所有用户代理中工作。

测试用例见http://greenbytes.de/tech/tc2231/ ,然后向微软、谷歌和苹果投诉。

于 2009-01-15T15:46:47.707 回答