2012-11-02 53 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