我正在尝试从数据库复制字节流,对其进行编码,最后将其显示在网页上。但是,我注意到以不同方式编码内容的不同行为(注意:我使用的是“西欧”编码,它具有拉丁字符集且不支持中文字符):
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” $æ•™å||€Œè®¾è®¡ç“”“这是正确的,因为它们都是西欧字符集。
这种行为差异的解释是什么?
答案 0 :(得分:10)
StreamReader
构造函数将在流中查找BOM并从中设置其编码,即使您传递了不同的编码。
它会在您的数据中看到UTF8 BOM并正确使用UTF8。
要防止此行为,请将false
作为第三个参数传递:
var fileStream = new StreamReader(new MemoryStream(content), encoding, false)