Pregunta

El siguiente fragmento de código (cortado por brevedad) genera un documento xml y lo escupe en un archivo. Si abro el archivo en Visual Studio, parece estar en caracteres chinos. Si lo abro en el Bloc de notas, se ve como se esperaba. Si I Console.WriteLine parece correcto.

Sé que está relacionado con la codificación, pero pensé que tenía todos los patos de codificación seguidos. ¿Qué falta?

StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.Unicode;
settings.Indent = true; 
settings.IndentChars = "\t";
using (XmlWriter textWriter = XmlWriter.Create(new StringWriter(stringBuilder), settings))
{
    textWriter.WriteStartElement("Submission");
    textWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
    textWriter.WriteEndElement();
}

using (StreamWriter sw = new StreamWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)))
            {
                sw.Write(stringBuilder.ToString());
            }
¿Fue útil?

Solución

El problema es que lo estás escribiendo en disco usando UTF-8, pero reclamará que será UTF-16 porque eso es lo que un StringWriter usa de forma predeterminada, y porque lo está configurando explícitamente para usar Encoding.Unicode también.

La forma más sencilla de solucionar esto es usar un StringWriter que se anuncia como UTF-8:

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

... y luego elimine la línea settings.Encoding = Encoding.Unicode . De esa manera usarás UTF-8 en todo momento. (De hecho, la propiedad Encoding de XmlWriterSettings se ignora cuando crea el XmlWriter con un TextWriter de todos modos).

Si realmente quiere UTF-16, cuando cree el StreamWriter , especifique también Encoding.Unicode .

Otros consejos

No estoy seguro de qué es Encoding.Unicode pero supongo que es UTF-16 que escribe dos bytes por carácter en el archivo. Para el texto ASCII normal, uno de los bytes es siempre 0.

Pruebe UTF-8 en su lugar. Esto debería verse igual en cualquier editor a menos que use caracteres especiales (con un punto de código > = 128).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top