Response.Write - Internet Explorer中的文件名编码错误

时间:2013-01-21 07:37:31

标签: asp.net internet-explorer encoding

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

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

这很好用。问题是,当我从Internet Explorer下载文件时,特殊字符(例如丹麦语,ø和å)被解释错误。所以我将'Testæøåfile.txt'的名称下载为'TestÃ|_ø_¥¥file.txt'

我已尝试在回复中添加字节顺序标记:

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

设置字符集:

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

但如果它有帮助则没有。 这似乎只是Internet Explorer中的一个问题。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

尝试指定如下所示的特定文件类型(这适用于excel文件类型) -

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

请参阅What content type to force download of text response?

答案 2 :(得分:0)

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

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