Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why does the Xdocument give me a utf16 declaration?

Tags:

c#

linq-to-xml

i'm creating a XDocument like this:

XDocument doc = new XDocument( new XDeclaration("1.0", "utf-8", "yes")); 

when i save the document like this (doc.Save(@"c:\tijd\file2.xml");) , i get this:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 

which is ok.

but i want to return the content as xml, and i found the following code:

 var wr = new StringWriter();              doc.Save(wr);              string s = (wr.GetStringBuilder().ToString()); 

this code works, but then the string 's' starts with this:

<?xml version="1.0" encoding="utf-16" standalone="yes"?> 

so it changed from utf8 to utf16, and that's not what i want, because now i can't read it in internet explorer.

Is there a way to prevent this behaviour?

like image 611
Michel Avatar asked Mar 09 '11 15:03

Michel


2 Answers

StringWriter advertises itself as using UTF-16. It's easy to fix though:

public class Utf8StringWriter : StringWriter {     public override Encoding Encoding { get { return Encoding.UTF8; } } } 

That should be enough in your particular case. A rather more well-rounded implementation would:

  • Have constructors matching those in StringWriter
  • Allow the encoding to be specified in the constructor too
like image 74
Jon Skeet Avatar answered Oct 05 '22 19:10

Jon Skeet


Very good answer using inheritance, just remember to override the initializer

   public class Utf8StringWriter : StringWriter     {         public Utf8StringWriter(StringBuilder sb) : base (sb)         {         }         public override Encoding Encoding { get { return Encoding.UTF8; } }     } 
like image 21
Sebastian Castaldi Avatar answered Oct 05 '22 18:10

Sebastian Castaldi