c#MemoryStream编码与Encoding.GetChars()

时间:2012-11-02 13:54:59

标签: c# character-encoding streamreader

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

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

Vs以上。

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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

要防止此行为,请将false作为第三个参数传递:

var fileStream = new StreamReader(new MemoryStream(content), encoding, false)