【问题标题】:How to display a non-ascii filename in the file download box in browsers?如何在浏览器的文件下载框中显示非 ASCII 文件名?
【发布时间】:2008-09-29 15:02:09
【问题描述】:

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

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

内容配置:附件;文件名="theasciifilename.doc"

除非你在文件名参数中破坏了一个 utf8 编码的字符串,Firefox 会很好地处理它,而 IE 会抛出。

有一个document on CodeProject that explains a method for encoding the filename.

本文档通过对字节进行十六进制编码,将 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 不承认!怎么办?

【问题讨论】:

    标签: encoding utf-8


    【解决方案1】:

    规范基本上不允许 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,它演示了它的工作原理以及可用的浏览器支持。

    【讨论】:

    • IE8(及更高版本)确实支持 RFC 2231,所有其他现代浏览器也是如此。唯一不能识别这种格式的指定文件名并且仍然有些流行的是 IE6 和 IE7。
    • IE8 不支持 RFC 2231,刚刚测试过。另见greenbytes.de/tech/tc2231
    【解决方案2】:

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

    【讨论】:

    • 没有“UTF-8 字符”这样的东西。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        万一链接消失,解决方法基本上是:

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2017-03-01
            • 2017-03-27
            • 2014-11-18
            • 2019-11-24
            • 1970-01-01
            • 1970-01-01
            • 2014-10-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多