Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确保我创建的文件下载是UTF-8?(而非无BOM的UTF-8)_C#_Asp.net_Asp.net Mvc 2_Encoding_Character Encoding - Fatal编程技术网

C# 如何确保我创建的文件下载是UTF-8?(而非无BOM的UTF-8)

C# 如何确保我创建的文件下载是UTF-8?(而非无BOM的UTF-8),c#,asp.net,asp.net-mvc-2,encoding,character-encoding,C#,Asp.net,Asp.net Mvc 2,Encoding,Character Encoding,我制作了一个下载功能,可以将消息下载到CSV文件(代码如下)。 现在,当我在记事本或记事本++中打开它时,我看到: 埃尼ø╬ ║► ░ èö (顺便说一句,这就是数据库中的内容) 现在,当我在Ms Excel中打开它时,它显示: 纽约 当我用notepad++打开它时,它说它是用“UTF8无BOM”编码的。 当我将它(用记事本++)编码为UTF-8时,一切都很顺利(也就是说,Excel也显示了正确的字符) 但是如何确保我从代码创建的文件是UTF-8? 这是我的代码: public ActionR

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

埃尼ø╬ ║► ░ èö

(顺便说一句,这就是数据库中的内容)

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

纽约

当我用notepad++打开它时,它说它是用“UTF8无BOM”编码的。 当我将它(用记事本++)编码为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("");
}
编辑:

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

UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetBytes(str);
我现在下载的是:

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

您可以稍微简化代码:

public ActionResult DownloadPersonalMessages()
{
    StringBuilder myCsv = new StringBuilder();
    myCsv.Append(new DownloadService().GetPersonalMessages());
    Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
    return File(Encoding.UTF8.GetBytes(myCsv.ToString()), "text/csv");
}

就UTF-8编码而言,我担心问题可能出在这个
GetPersonalMessages
方法中。您可能需要返回一个可以直接作为文件返回的流或字节数组。

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

Zareth的回答帮助了OP,但实际上它没有回答问题。以下是正确的解决方案:


字节顺序标记(虽然UTF8在技术上不是必需的)提示某些程序(例如Excel>2007)使用UTF8。您必须通过
GetPreamble()
方法手动包含它。

将尝试这样做。通过尝试所有不同的东西,代码变得如此之大:)嗯,当我返回一个字节数组时,会变成UTF8吗?好的,我试试看。函数的作用是:从数据库btwThanks读取一个nvarchar字段,将我的代码改为System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(true);但是仍然没有运气…你确实让我在getbytes和所有的方面走上了正确的道路。我走错了方向,因为notepad++说这是一个utf8而不是bom文件,当我把它转换成utf8时,它工作了。当然,utf8在我这方面不是必需的。我试过用独角兽编码和tadaa!成功了。谢谢你的思考。仅供参考:出于某种原因,构造函数参数实际上并没有导致它输出BOM。您必须手动预写
.getPremission()
的结果。MIME类型应为:
text/csv
,(如果您想更精确,请使用:
text/csv;charset=utf-8
,)。@fini007:我认为这取决于意图,“如果服务器说‘此数据的类型为text/csv’,则客户端可以理解它可以在内部呈现该数据,而如果服务器说‘此数据的类型为application/csv’,则客户端知道它需要启动在操作系统上注册的应用程序以打开csv文件。”如果您希望浏览器启动Excel,则“application/csv”可能更好。当然,如果您使用内容配置来下载文件,那么这就没有什么实际意义了。
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");
}