2012-11-02 17 views
7

मैं डेटाबेस से एक बाइट स्ट्रीम कॉपी करने की कोशिश कर रहा हूं, इसे एन्कोड करता हूं और अंत में इसे वेब पेज पर प्रदर्शित करता हूं।सी # मेमोरीस्ट्रीम एन्कोडिंग बनाम। एन्कोडिंग। गेटचर्स()

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

सामग्री, जैसे 'डी $ 教学 而 设计 的 "है, जो सही नहीं है क्योंकि एन्कोडिंग उन अक्षरों को समर्थन नहीं करना चाहिए एक स्ट्रिंग का उत्पादन करेगा कोड के पहले खंड से चीनी वर्ण शामिल हैं, जबकि दूसरे खंड "डी $ æ • ™ å|è € Œè®¾è®¡çš" "उत्पन्न करेगा जो कि सही है क्योंकि वे सभी पश्चिमी यूरोपीय चरित्र सेट में हैं।

व्यवहार में इस अंतर के लिए स्पष्टीकरण क्या है?

उत्तर

9

StreamReader कन्स्ट्रक्टर स्ट्रीम में बीओएम की तलाश करेगा और उनके एन्कोडिंग को सेट करेगा, भले ही आप एक अलग एन्कोडिंग पास करते हों।

यह आपके डेटा में यूटीएफ 8 बीओएम देखता है और यूटीएफ 8 का सही उपयोग करता है।

इस व्यवहार को रोकने के लिए false तीसरे पैरामीटर के रूप में पारित:

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

धन्यवाद! अब वे एक ही स्ट्रिंग का उत्पादन करते हैं। जिज्ञासा से बाहर, कोड का कौन सा ब्लॉक आपको सुझाव देना बेहतर है? क्या कोई भी फायदे या नुकसान हैं? – Sidawy

संबंधित मुद्दे