2008-12-16 8 views
8

Medio Ambiente es VS2008, .Net 3.5.Net XmlWriter - codificación inesperada me está confundiendo

El siguiente código C# (tenga en cuenta la codificación especificada de UTF8)

XmlWriterSettings settings = new XmlWriterSettings(); 
StringBuilder sb = new StringBuilder(); 
settings.Encoding = System.Text.Encoding.UTF8; 
settings.Indent = false; 
settings.NewLineChars = "\n"; 
settings.ConformanceLevel = System.Xml.ConformanceLevel.Document; 

XmlWriter writer = XmlWriter.Create (sb, settings); 
{ 
    // Write XML data. 
    writer.WriteStartElement ("CCHEADER"); 
    writer.WriteAttributeString ("ProtocolVersion", "1.0.0"); 
    writer.WriteAttributeString ("ServerCapabilities", "0x0000000F"); 
    writer.WriteEndElement(); 
    writer.Flush(); 
} 

genera realidad el XML (> < omitidas porque SO barfs en ellos):

? xml version = "1.0" encoding = "utf-16"?
CCHEADER ProtocolVersion = "1.0.0" ServerCapabilities = "0x0000000F"/

¿Por qué aparece aquí la codificación incorrecta? Qué estoy haciendo mal ?

Respuesta

15

Sospecho que es porque está escribiendo en un StringBuilder, que es inherentemente UTF-16. Una alternativa para evitar esto es crear una clase derivada de StringWriter, pero que anula la propiedad Codificación.

Creo que tengo una en MiscUtil - pero es bastante trivial escribir de todos modos. Algo así:

public sealed class StringWriterWithEncoding : StringWriter 
{ 
    private readonly Encoding encoding; 

    public StringWriterWithEncoding (Encoding encoding) 
    { 
     this.encoding = encoding; 
    } 

    public override Encoding Encoding 
    { 
     get { return encoding; } 
    } 
} 
+0

@Steven: Oh, no sé. La pregunta había estado activa durante aproximadamente 4 minutos. Eso cuenta como definitivamente obsoleto según los estándares SO ... –

+0

Aha - siguió el enlace - usted es un MVP. Debería haber sabido. Pasé 8 años como MVP de WinSDK. Ese conocimiento se está volviendo rancio a medida que lucho con estas cosas manejadas. –

+0

También tenga en cuenta que si deja que 'Encoding' devuelva' null' en su especialización 'StringWriter', entonces' XmlWriter' escribirá la declaración XML simplemente como '', Es decir, sin ninguna codificación información en absoluto. Esta es una declaración XML perfectamente válida. Esto es útil si somos agnósticos sobre la codificación. –

2

A .Net String está codificado en Unicode (UTF-16). Supongo que esta es la fuente de tus problemas de codificación porque estás escribiendo en un StringBuilder.

Cuestiones relacionadas