我使用以下代码将文件从服务器发送到客户端:
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 中的问题。
最佳答案
header 不使用内容的编码,因此更改内容编码没有帮助。有一个指定 header 参数编码的标准,但它是相当新的,因此并非所有浏览器都完全支持它:
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
注意:该代码对除字母数字之外的所有字符进行编码。这是可行的,但并非所有其他字符都需要编码。在检查标准后,您可以改进代码以保留更多未编码的字符。
关于asp.net - Response.Write - Internet Explorer 中的文件名编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14434239/