c#MemoryStream编码与 Encoding.GetChars()

Sid*_*awy 8 c# character-encoding streamreader

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

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

比.

var encoding = Encoding.GetEncoding(1252 /*Western European*/);
var str = new string(encoding.GetChars(content));
Run Code Online (Sandbox Code Playgroud)

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

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

SLa*_*aks 10

StreamReader构造函数将查找流中的材料明细表,并从中设置它的编码,即使你通过不同的编码.

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

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

var fileStream = new StreamReader(new MemoryStream(content), encoding, false)
Run Code Online (Sandbox Code Playgroud)