2012-02-27 10 views
20

मैं इस विस्तार विधिXmlWriter हमेशा utf-16 एन्कोडिंग आउटपुट क्यों कर रहा है?

public static string SerializeObject<T>(this T value) 
    { 
     var serializer = new XmlSerializer(typeof(T));   
     var settings = new XmlWriterSettings 
         { 
         Encoding = new UTF8Encoding(true), 
         Indent = false, 
         OmitXmlDeclaration = false, 
         NewLineHandling = NewLineHandling.None 
         }; 

     using(var stringWriter = new StringWriter()) 
     { 
      using(var xmlWriter = XmlWriter.Create(stringWriter, settings)) 
      { 
       serializer.Serialize(xmlWriter, value); 
      } 

      return stringWriter.ToString(); 
     } 
    } 

है, लेकिन जब भी मैं इस फोन यह निर्दिष्ट utf-16 का एक एन्कोडिंग, यानी <?xml version="1.0" encoding="utf-16"?> है। मैं क्या गलत कर रहा हूं?

+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/427725/ [कैसे XML करने के लिए अन्य है कि UTF-16 XmlWriter साथ कोई एन्कोडिंग विशेषता डाल करने के लिए?] कैसे करने के लिए डाल-एक एन्कोडिंग-विशेषता-टू-एक्सएमएल-अन्य-कि-utf-16-के साथ-xmlwriter) –

+0

मैंने महसूस किया गया है कि यह एक शिकार है, इसलिए –

उत्तर

10

तार UTF-16 के हैं, इसलिए एक StringWriter के लिए लिख हमेशा UTF-16 का उपयोग करेगा। यदि वह नहीं है जो आप चाहते हैं, तो अपने पसंदीदा एन्कोडिंग के साथ, कुछ अन्य TextWriter व्युत्पन्न कक्षा का उपयोग करें।

+1

सिर हिलाता है। तो XmlWriterSettings पर एक एन्कोडिंग संपत्ति होने के बाद बिंदु क्या है। हां एक स्ट्रिंग यूटीएफ -16 है, लेकिन अगर हम एक स्ट्रिंग को क्रमबद्ध कर रहे हैं, तो इसकी वजह है कि हम किसी फ़ाइल या कुछ को लिखने वाले हैं, और हम फ़ाइल के वास्तविक एन्कोडिंग से मेल खाने के लिए एक्सएमएल घोषणा की एन्कोडिंग विशेषता चाहते हैं बनाएं, और यह यूटीएफ -16 होने की संभावना नहीं है। – bbsimonbb

+0

@user सीधे एक स्ट्रीम पर जाने के लिए एक स्ट्रिंग पर serialize नहीं है। –

+0

ठीक है। यह और अधिक समझ में आता है। – bbsimonbb

14

जहाँ तक मुझे पता है, StringWriter वर्ग हमेशा UTF 16 एन्कोडिंग जब स्ट्रिंग के लिए serializing का प्रयोग करेंगे।

public class StringWriterWithEncoding : StringWriter 
{ 
    private readonly Encoding _encoding; 

    public StringWriterWithEncoding() 
    { 
    } 

    public StringWriterWithEncoding(IFormatProvider formatProvider) 
     : base(formatProvider) 
    { 
    } 

    public StringWriterWithEncoding(StringBuilder sb) 
     : base(sb) 
    { 
    } 

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider) 
     : base(sb, formatProvider) 
    { 
    } 


    public StringWriterWithEncoding(Encoding encoding) 
    { 
     _encoding = encoding; 
    } 

    public StringWriterWithEncoding(IFormatProvider formatProvider, Encoding encoding) 
     : base(formatProvider) 
    { 
     _encoding = encoding; 
    } 

    public StringWriterWithEncoding(StringBuilder sb, Encoding encoding) 
     : base(sb) 
    { 
     _encoding = encoding; 
    } 

    public StringWriterWithEncoding(StringBuilder sb, IFormatProvider formatProvider, Encoding encoding) 
     : base(sb, formatProvider) 
    { 
     _encoding = encoding; 
    } 

    public override Encoding Encoding 
    { 
     get { return (null == _encoding) ? base.Encoding : _encoding; } 
    } 
} 

तो आप इस के बजाय का उपयोग कर सकते हैं::

using(var stringWriter = new StringWriterWithEncoding(Encoding.UTF8)) 
{ 
    ... 
} 
+0

बिग +1 बंद करने के लिए मतदान, काम ठीक , धन्यवाद। –

1

आप जो एक ओवरराइड एन्कोडिंग संपत्ति है StringWriter से एक नया वर्ग प्राप्त करना चाहिए आप अपनी खुद की ओवरराइड वर्ग है कि एक अलग एन्कोडिंग स्वीकार करता है लिख सकते हैं।

1

स्वीकार किए जाते हैं जवाब कहते हैं, StringWriter UTF-16 (यूनिकोड) डिफ़ॉल्ट और डिजाइन कर रहा है। यदि आप अंत में यूटीएफ -8 स्ट्रिंग प्राप्त करके ऐसा करना चाहते हैं, तो इसे करने के लिए मैं आपको 2 तरीके दे सकता हूं:

समाधान # 1 (बहुत कुशल, बुरा अभ्यास नहीं, लेकिन नौकरी मिलती है किया गया): इसे एक टेक्स्ट फ़ाइल में डंप करें और इसे वापस पढ़ें, फ़ाइल फ़ाइल को हटाएं (शायद केवल छोटी फाइलों के लिए उपयुक्त है, अगर आप इसे भी करना चाहते हैं - बस यह दिखाना चाहता था कि यह किया जा सकता है!)

public static string SerializeObject<T>(this T value) 
{ 
    var serializer = new XmlSerializer(typeof(T));   
    var settings = new XmlWriterSettings 
        { 
        Encoding = new UTF8Encoding(true), 
        Indent = false, 
        OmitXmlDeclaration = false, 
        NewLineHandling = NewLineHandling.None 
        }; 


    using(var xmlWriter = XmlWriter.Create("MyFile.xml", settings)) 
    { 
     serializer.Serialize(xmlWriter, value); 
    } 

    XmlDocument xml = new XmlDocument(); 
    xml.Load("MyFile.xml"); 
    byte[] bytes = Encoding.UTF8.GetBytes(xml.OuterXml);   
    File.Delete("MyFile.xml"); 

    return Encoding.UTF8.GetString(bytes); 

} 

समाधान # 2 (बेहतर, आसान, और अधिक सुरुचिपूर्ण समाधान!): कर की तरह तुम्हारे पास है, StringWriter का उपयोग कर, लेकिन इसकीका उपयोगसंपत्ति UTF-8 में यह स्थापित करने के लिए:

public static string SerializeObject<T>(this T value) 
{ 
    var serializer = new XmlSerializer(typeof(T));   
    var settings = new XmlWriterSettings 
        { 
        Encoding = new UTF8Encoding(true), 
        Indent = false, 
        OmitXmlDeclaration = false, 
        NewLineHandling = NewLineHandling.None 
        }; 

    using(var stringWriter = new StringWriter(Encoding.UTF8)) 
    { 
     using(var xmlWriter = XmlWriter.Create(stringWriter, settings)) 
     { 
      serializer.Serialize(xmlWriter, value); 
     } 

     return stringWriter.ToString(); 
    } 
} 
की
+0

क्या मुझे यहां कुछ याद आ रही है? स्ट्रिंगवाइटर एक एन्कोडिंग प्रॉपर्टी को कन्स्ट्रक्टर तर्क के रूप में नहीं लेता है। – crush

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