2011-03-09 41 views
26

Estoy creando un XDocument así:¿por qué el Xdocument me da una declaración utf16?

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

al guardar el documento como este (doc.Save(@"c:\tijd\file2.xml");), me sale esto:

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

que está bien.

pero quiero devolver el contenido como XML, y me encontré con el siguiente código:

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

funciona este código, pero luego la cadena 's' comienza con esto:

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

así que cambió de utf8 a utf16, y eso no es lo que quiero, porque ahora no puedo leerlo en Internet Explorer.

¿Hay alguna manera de evitar este comportamiento?

+2

Hay una bandera roja grande aquí, el escritor cadena realmente contiene una cadena UTF-16 codificada. Incluso si anula la propiedad Codificación. ¿Cómo pasa esto de StringWriter a IE? –

+0

Buena pregunta. Guardo la cadena 's' en un archivo con File.WriteAllText y luego la abro con IE. No especifiqué eso muy claramente en mi pregunta ... – Michel

+1

Correcto, la llamada File.WriteAllText() es la que * realmente * determina la codificación. El valor predeterminado es utf-8 a menos que use la sobrecarga que toma una Codificación. –

Respuesta

36

StringWriter se anuncia como el uso de UTF-16. Sin embargo, es fácil de solucionar:

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

Eso debería ser suficiente en su caso particular. Una aplicación bastante más bien redondeado haría:

  • tienen constructores que coincidan con las de StringWriter
  • Permitir la codificación que se especifica en el constructor también
+1

Ah, vale, el StringWriter lo convierte en UTF-16. Siempre trato de entender la codificación, pero parece que no se pega. Suena lógico que un objeto UTF-16 como el stringwriter crea una cadena UTF-16, pero lo que me sorprendió es que también cambió la declaración en el archivo XML. No pensé que fue causado por StringWriter, porque siempre estaba luchando con UTF-16 también cuando estaba usando XmlDocument antes del XDocument, así que pensé que era solo un hábito de .Net o algo así. ¡Así que gracias por la respuesta! – Michel

+3

@Michel: Básicamente, el método Save * le pregunta * al escritor qué codificación usar, para que use lo que sea apropiado. Es un poco desordenado, estoy de acuerdo ... –

+0

gracias por la información adicional desvirtuada. – Michel

1

que se necesitan para establecer el StreamWriter.Encoding utilizar UTF -8 en lugar de Unicode (UTF-16)

Dado que no es un StreamWriter, esta respuesta solo se deja para la posteridad.

+0

No hay ningún StreamWriter involucrado aquí. Solo hay un StringWriter, y no se puede establecer programáticamente la codificación de eso; tienes que hacerlo a través de la herencia :( –

+0

Wow sí, leí totalmente lo que se estaba usando. Herencia es. – msarchet

2

muy buena respuesta por medio de la herencia, sólo recuerda a anular el inicializador

public class Utf8StringWriter : StringWriter 
    { 
     public Utf8StringWriter(StringBuilder sb) : base (sb) 
     { 
     } 
     public override Encoding Encoding { get { return Encoding.UTF8; } } 
    } 
Cuestiones relacionadas