【问题标题】:Response.Write - filename encoding wrong in Internet ExplorerResponse.Write - Internet Explorer 中的文件名编码错误
【发布时间】:2013-01-04 05:57:07
【问题描述】:

我使用以下代码将文件从我的服务器发送到客户端:

Response.AppendHeader("content-disposition", "attachment; filename=" + FileName);
Response.ContentType = MimeType;
Response.WriteFile(PathToFile);
Response.End();

这很好用。问题是,当我从 Internet Explorer 下载文件时,特殊字符(如丹麦语 æ、ø 和 å)会被错误解释。因此,我使用名称为“Test æøå file.txt”的文件下载为“Test æ_ø_Ã¥ f​​ile.txt”

我尝试在响应中添加字节顺序标记:

byte[] BOM = { 0xEF, 0xBB, 0xBF };
Response.BinaryWrite(BOM);

并设置字符集:

Response.Charset = "UTF-8";
Response.ContentEncoding = System.Text.Encoding.UTF8;

但如果有帮助,那就没有了。 这似乎只是 Internet Explorer 中的问题。

【问题讨论】:

    标签: asp.net internet-explorer encoding


    【解决方案1】:

    标头不使用内容的编码,因此更改内容编码无济于事。有一个为标头参数指定编码的标准,但它是相当新的,所以它不会在所有浏览器中得到完全支持:

    http://greenbytes.de/tech/webdav/rfc5987.html

    这是您对名称进行编码的方式:

    string FileName = "Test æ ø å file.txt";
    
    string name = String.Concat(Encoding.UTF8.GetBytes(FileName).Select(b => {
      if ((b >= 48 && b <= 57) || (b >= 65 && b <= 90) || (b >= 97 && b <= 122)) {
        return new String((char)b, 1);
      } else {
        return String.Format("%{0:x2}", b);
      }
    }).ToArray());
    
    Response.AppendHeader("content-disposition", "attachment; filename*=UTF-8''" + name);
    

    标题中的文本如下所示:

    attachment; filename*=UTF-8''Test%20%c3%a6%20%c3%b8%20%c3%a5%20file%2etxt
    

    注意:该代码对除字母数字以外的所有字符进行编码。这可行,但并非所有其他字符都需要编码。在检查标准后,您可以改进代码以保留更多未编码的字符。

    【讨论】:

    • 非常感谢您的快速回复。我明白你的意思,我已经尝试了你的示例代码,它消除了 IE 文件名问题。但在其他浏览器中,文件名现在是“Test%20%c3%a6%20%c3%b8%20%c3%a5%20file%2etxt”。那么我应该根据什么浏览器请求文件来处理文件名,还是没有通用的解决方案?
    • @Farsen:似乎缺乏支持,因此针对不同浏览器的不同代码将是您唯一的选择。对于较旧的 IE 浏览器,您需要规范化文件名,因为它们不支持使用 Unicode 的任何一种方式。
    • .NET 中有一个特殊的类 'ContentDisposition'。检查这个答案:stackoverflow.com/a/30972670/155687
    【解决方案2】:

    尝试指定特定的文件类型,如下所示(这是针对 excel 文件类型)-

    Response.ContentType = "application/vnd.ms-excel";
    

    What content type to force download of text response?

    【讨论】:

    • 我已经将内容类型设置为正式的mimetypes,不管是什么类型,编码仍然是错误的:(
    【解决方案3】:

    解决 Internet Explorer 文件名问题要容易得多,您会找到答案here

    你必须HttpUtility.UrlPathEncode(yourFileName) - 因为这会弄乱其他浏览器中的文件名,你必须检查浏览器 (Request.Browser.Browser) 是否是 Internet Explorer (IE 直到版本 10, Internet Explorer 版本 11)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2020-09-11
      • 2013-04-28
      • 2011-06-23
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多