2012-11-02 18 views
7

我想从数据库中复制一个字节流,对其进行编码并最终将其显示在网页上。然而,我注意到编码以不同的方式(注:我使用的是“西欧”编码具有拉丁字符集,不支持中国文字):内容不同的行为c#MemoryStream编码比。 Encoding.GetChars()

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 $æ™è|è设计皔“这是正确的,因为这些都是西欧字符集。

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

回答

9

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

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

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

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

谢谢!现在他们产生相同的字符串。出于好奇,你建议使用哪一段代码更好?是否有任何优点或缺点? – Sidawy