如何在C#中使用带有BOM的UTF8编码的GetBytes()?

我在C#中的asp.net mvc 2应用程序中遇到了UTF8编码的问题。 我想让用户从一个string下载一个简单的文本文件。 我正在尝试使用以下行获取字节数组:

var x = Encoding.UTF8.GetBytes(csvString);

但是当我返回下载使用:

return File(x, ..., ...);

我得到一个没有BOM的文件,所以我没有正确显示克罗地亚字符。 这是因为我的字节数组在编码后不包含BOM。 我手动插入这些字节,然后显示正确,但这不是最好的办法。

我也尝试创buildUTF8Encoding类实例,并将布尔值(true)传递给其构造函数以包含BOM,但它也不起作用。

任何人都有解决scheme? 谢谢!

尝试像这样:

 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"); } 

原因是采用布尔参数的UTF8Encoding构造函数不能达到您所期望的效果:

 byte[] bytes = new UTF8Encoding(true).GetBytes("a"); 

结果数组将包含一个值为97的单个字节。没有BOM,因为UTF8不需要BOM。

我创build了一个简单的扩展来将任何编码中的任何string转换成字节数组的表示forms,当它被写入文件或stream时:

 public static class StreamExtensions { public static byte[] ToBytes(this string value, Encoding encoding) { using (var stream = new MemoryStream()) using (var sw = new StreamWriter(stream, encoding)) { sw.Write(value); sw.Flush(); return stream.ToArray(); } } } 

用法:

 stringValue.ToBytes(Encoding.UTF8) 

这也适用于需要BOM的其他编码,如UTF-16。

UTF-8不需要BOM,因为它是一个1字节的字序列。 UTF-8 = UTF-8BE = UTF-8LE。

相比之下,由于UTF-16是一个2字节的字序列,因此UTF-16需要在stream的开头部署一个BOM来标识stream的其余部分是UTF-16BE还是UTF-16LE。字中的字节是BE或LE。

这个问题不在于Encoding.UTF8类。 问题在于你用什么程序来查看文件。

请记住,.NETstring是所有unicode,而留在内存中,所以如果你可以看到你的csvString与debugging器正确的问题是写入文件。

在我看来你应该返回一个FileResult与文件相同的编码。 尝试设置返回的文件编码,