2013-02-07 11 views
6

Ich habe XML, die ich per API in einem anderen Resurse sende. Ich erstelle es durch XDocument:Wie ändert sich die Codierung im TextWriter-Objekt?

XDocument xDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"), 
    new XElement("Entity",new XAttribute("Type", "attribute1"), 
     new XElement("Fields",... 

Wenn ich es in die Anfrage habe es ohne Erklärung gesendet. So mache ich weiter:

StringBuilder builder = new StringBuilder(); 
TextWriter writer = new StringWriter(builder); 

using (writer) 
{ 
    xDoc.Save(writer); 
} 

Aber jetzt TextWriter ändern Codierung in XML zu UTF-16. Ich muss es wieder auf utf-8 ändern.

Antwort

13

Dies scheint seltsam, aber es sieht aus wie Sie StringWriter Unterklasse haben, wenn Sie zu einem string mit utf-8-Codierung in der XML ausgegeben werden sollen.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     XDocument xDoc = new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement("Entity",new XAttribute("Type", "attribute1"))); 

     StringBuilder builder = new StringBuilder(); 
     using (TextWriter writer = new EncodingStringWriter(builder, Encoding.UTF8)) 
     { 
      xDoc.Save(writer); 
     } 

     Console.WriteLine(builder.ToString()); 
    } 
} 

public class EncodingStringWriter : StringWriter 
{ 
    private readonly Encoding _encoding; 

    public EncodingStringWriter(StringBuilder builder, Encoding encoding) : base(builder) 
    { 
     _encoding = encoding; 
    } 

    public override Encoding Encoding 
    { 
     get { return _encoding; }     
    } 
} 
4

Versuche

TextWriter ws = new StreamWriter(path, true, Encoding.UTF8); 

oder

TextWriter ws = new StreamWriter(stream, Encoding.UTF8); 
+1

oder 'Encoding.GetEncoding (1256)', wenn Sie eine bestimmte Codepage (1256 ist Arabisch) – BlueChippy

+0

'StreamWriter' scheint, wie die offensichtliche Lösung, ja; Es ist schließlich die spezifische Kodierung-anpassbare Implementierung von 'TextWriter', dem Typ, der von' XDocument.Save' erwartet wird. Auch wenn ich nur zurück zu String gehe (aber die XML-Deklaration richtig verstanden habe), benutze ich das einfach auf einem 'MemoryStream'. – Nyerguds