Pregunta

Tengo problemas para escribir caracteres noruegos en un archivo XML con C #. Tengo una variable de cadena que contiene texto en noruego (con letras como & # 230; & # 248; & # 229;).

Estoy escribiendo el XML con un XmlTextWriter, escribiendo los contenidos en un MemoryStream como este:

MemoryStream stream = new MemoryStream();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, Encoding.GetEncoding("ISO-8859-1"));
xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument(); //Start doc

Luego agrego mi texto en noruego como este:

xmlTextWriter.WriteCData(myNorwegianText);

Luego escribo el archivo en el disco de esta manera:

FileStream myFile = new FileStream(myPath, FileMode.Create);
StreamWriter sw = new StreamWriter(myFile);

stream.Position = 0;
StreamReader sr = new StreamReader(stream);
string content = sr.ReadToEnd();

sw.Write(content);
sw.Flush();

myFile.Flush();
myFile.Close();

Ahora el problema es que en el archivo sobre esto, todos los caracteres noruegos se ven divertidos.

Probablemente estoy haciendo lo anterior de alguna manera estúpida. ¿Alguna sugerencia sobre cómo solucionarlo?

¿Fue útil?

Solución

¿Por qué escribe el XML primero en un MemoryStream y luego lo escribe en el flujo de archivos real? Eso es bastante ineficiente. Si escribe directamente en FileStream, debería funcionar.

Si aún desea hacer la escritura doble, por cualquier razón, haga una de dos cosas. O bien

  1. Asegúrese de que los objetos StreamReader y StreamWriter que usa all usen la codificación same como la que usó con XmlWriter (no solo StreamWriter, como alguien más sugirió), o

  2. No use StreamReader / StreamWriter. En su lugar, simplemente copie el flujo en el nivel de byte usando un byte simple [] y Stream.Read/Write. Esto va a ser, por cierto, mucho más eficiente de todos modos.

Otros consejos

Tanto su StreamWriter como su StreamReader están utilizando UTF-8, porque no está especificando la codificación. Es por eso que las cosas se están corrompiendo.

Como dijo tomasr, usar un FileStream para comenzar sería más simple, pero también MemoryStream tiene el útil "Escribir en" método que le permite copiarlo a un FileStream muy fácilmente.

Espero que tenga una declaración de uso en su código real, por cierto, no desea dejar abierto el identificador de archivo si algo sale mal mientras lo escribe.

Jon

Debe establecer la codificación cada vez que escriba una cadena o lea datos binarios como una cadena.

    Encoding encoding = Encoding.GetEncoding("ISO-8859-1");

    FileStream myFile = new FileStream(myPath, FileMode.Create);
    StreamWriter sw = new StreamWriter(myFile, encoding);

    stream.Position = 0;
    StreamReader sr = new StreamReader(stream, encoding);
    string content = sr.ReadToEnd();

    sw.Write(content);
    sw.Flush();

    myFile.Flush();
    myFile.Close();

Como se mencionó en las respuestas anteriores, el mayor problema aquí es el Codificación , que se está omitiendo debido a que no se especifica.

Cuando no especifica un Codificación para este tipo de conversión, se utiliza el valor predeterminado de UTF-8 , que puede coincidir o no con su escenario. También está convirtiendo los datos innecesariamente empujándolos a un MemoryStream y luego a un FileStream .

Si sus datos originales no son UTF-8 , lo que sucederá aquí es que la primera transición al MemoryStream intentará decodificar usando la codificación predeterminada of UTF-8 - y corrompe sus datos como resultado. Cuando escribe en el FileStream , que también usa UTF-8 como codificación por defecto, simplemente persiste esa corrupción en el archivo.

Para solucionar el problema, es probable que necesite especificar Codificación en sus objetos Stream .

También puede omitir el proceso de MemoryStream por completo, lo que será más rápido y más eficiente. Tu código actualizado podría verse más como:

FileStream fs = new FileStream(myPath, FileMode.Create);

XmlTextWriter xmlTextWriter = 
    new XmlTextWriter(fs, Encoding.GetEncoding("ISO-8859-1"));

xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument(); //Start doc

xmlTextWriter.WriteCData(myNorwegianText);

StreamWriter sw = new StreamWriter(fs);

fs.Position = 0;
StreamReader sr = new StreamReader(fs);
string content = sr.ReadToEnd();

sw.Write(content);
sw.Flush();

fs.Flush();
fs.Close();

¿Qué codificación utiliza para mostrar el archivo de resultados? Si no está en ISO-8859-1, no se mostrará correctamente.

¿Hay alguna razón para usar esta codificación específica, en lugar de, por ejemplo, UTF8?

Después de investigar, esto funcionó mejor para mí:

var doc = new XDocument(new XDeclaration("1.0", "ISO-8859-1", ""));
        using (XmlWriter writer = doc.CreateWriter()){
            writer.WriteStartDocument();
            writer.WriteStartElement("Root");
            writer.WriteElementString("Foo", "value");
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
        doc.Save("dte.xml");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top