8

我正在尝试从数据库中复制字节流,对其进行编码并最终将其显示在网页上。但是,我注意到以不同方式对内容进行编码的不同行为(注意:我使用的是具有拉丁字符集且不支持中文字符的“西欧”编码):

var encoding = Encoding.GetEncoding(1252 /*Western European*/);
using (var fileStream = new StreamReader(new MemoryStream(content), encoding))
{
    var str = fileStream.ReadToEnd();
}

比。

var encoding = Encoding.GetEncoding(1252 /*Western European*/);
var str = new string(encoding.GetChars(content));

如果内容中包含汉字,那么第一段代码会产生类似“D$教学而设计的”这样的字符串,这是不正确的,因为编码不应该支持这些字符,而第二段代码会产生“D$æ•” ™å¦è€Œè®¾è®¡çš„”这是正确的,因为它们都在西欧字符集中。

这种行为差异的解释是什么?

4

1 回答 1

10

构造StreamReader函数将在流中查找 BOM 并从中设置编码,即使您传递了不同的编码。

它会在您的数据中看到 UTF8 BOM 并正确使用 UTF8。

为了防止这种行为,false作为第三个参数传递:

var fileStream = new StreamReader(new MemoryStream(content), encoding, false)
于 2012-11-02T13:59:55.360 回答