如何确保我创建的filedownload是UTF-8?(而不是没有BOM的UTF-8)

Mic*_*hel 8 c# asp.net encoding character-encoding asp.net-mvc-2

我已经制作了下载功能,可以将消息下载到CSV文件中(代码如下).现在当我用记事本或记事本++打开它时,我看到了这个:

NY纽约ø??? ?êö

(这就是数据库btw中的内容)

现在,当我在Ms-Excel中打开它时,它会显示:

éNYÃâ€â€â€â€ÃÃÃÃÃ

当我在记事本++中打开它时,它说它是在'没有BOM的UTF8'中编码的.当我将它(在记事本++中)编码为UTF-8时,一切顺利(也就是说,Excel也显示正确的字符)

但是我怎样才能确保我从我的代码创建的文件是UTF-8?

这是我的代码:

public ActionResult DownloadPersonalMessages()
{    
    StringBuilder myCsv = new StringBuilder();
    myCsv.Append(new DownloadService().GetPersonalMessages());

    this.Response.ContentType = "text/csv";
    Response.AddHeader("content-disposition", "attachment; filename=PersonalMessages.csv");
    Response.ContentEncoding = Encoding.UTF8;
    Response.Write(myCsv.ToString());
    Response.Flush();
    Response.HeaderEncoding = Encoding.UTF8;
    return Content("");
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我的函数现在返回一个ByteArray转换

UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetBytes(str);
Run Code Online (Sandbox Code Playgroud)

我的下载现在是这样的:

Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
return File(new DownloadService().GetPersonalMessages(), "text/csv");
Run Code Online (Sandbox Code Playgroud)

Str*_*ior 21

Zareth的回答帮助了OP,但实际上并没有回答这个问题.这是其他帖子的正确解决方案:

public ActionResult Download()
{
    var data = Encoding.UTF8.GetBytes("some data");
    var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
    return File(result, "application/csv", "foo.csv");
}
Run Code Online (Sandbox Code Playgroud)

字节顺序标记(虽然在UTF8技术上不是必需的)将某些程序(例如Excel> 2007)与您使用UTF8的事实联系起来.您必须通过该GetPreamble()方法手动包含它.


Zar*_*eth 4

您可能想尝试使用UTF8Encoding类。构造函数有一个参数,用于确定是否应提供 BOM。您可能必须使用 GetBytes 方法并将字符串作为一系列字节写入响应中,而不是将其转换回 .net 字符串对象。