59

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

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

但是当我使用以下命令返回下载时:

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

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

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

有人有解决方案吗?谢谢!

4

4 回答 4

147

试试这样:

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。

于 2010-12-10T23:11:08.007 回答
20

我创建了一个简单的扩展,用于在将任何编码的任何字符串写入文件或流时将其转换为字节数组的表示形式:

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。

于 2015-06-15T07:28:16.653 回答
2

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

相比之下,UTF-16 需要在流的开头有一个 BOM 来识别流的其余部分是 UTF-16BE 还是 UTF-16LE,因为 UTF-16 是一个 2 字节字的序列,而 BOM 识别是否字中的字节是 BE 或 LE。

问题不在于Encoding.UTF8班级。问题在于您用于查看文件的任何程序。

于 2010-12-10T23:11:19.097 回答
-2

请记住,.NET 字符串在内存中时都是 unicode,因此如果您可以使用调试器正确查看 csvString,则问题出在写入文件。

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

于 2010-12-10T23:12:25.057 回答