2012-11-02 20 views
7

Sto cercando di copiare un flusso di byte da un database, codificarlo e infine visualizzarlo su una pagina web. Tuttavia, sto notando un comportamento diverso che codifica per il contenuto in modi diversi (nota: Sto usando la codifica "occidentale europea", che ha un set di caratteri latini e non supporta i caratteri cinesi):C# MemoryStream Encoding vs. Encoding.GetChars()

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)); 

Se il contenuto contiene caratteri cinesi rispetto al primo blocco di codice produrrà una stringa come "D $ 教学 而 设计 的", che non è corretto in quanto la codifica non dovrebbe sostenere quei personaggi, mentre il secondo blocco produrrà "D $ æ • ™ å|è € Œè®¾è®¡çš" "che è corretto poichè quelli sono tutti nel set di caratteri dell'Europa occidentale.

Qual è la spiegazione di questa differenza di comportamento?

risposta

9

Il costruttore StreamReader cerca le distinte materiali nello stream e imposta la codifica da esse, anche se si passa una codifica diversa.

Visualizza la BOM UTF8 nei dati e utilizza correttamente UTF8.

Per impedire questo comportamento, passare false come terzo parametro:

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

Grazie! ora producono la stessa stringa. Per curiosità, quale blocco di codice suggerisci è meglio usare? Ci sono vantaggi o svantaggi di entrambi? – Sidawy