Frage

ich habe ein Problem norwegische Zeichen in eine XML-Datei zu schreiben mit C #. Ich habe ein String-Variable etwas norwegischen Text enthält (mit Buchstaben wie AEOA).

Ich bin das Schreiben der XML ein XmlTextWriter verwenden, schreibt den Inhalt in einen Memorystream wie folgt aus:

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

Dann füge ich meinen norwegischen Text wie folgt aus:

xmlTextWriter.WriteCData(myNorwegianText);

Dann schreibe ich die Datei auf Datenträger wie folgt aus:

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();

Das Problem ist jetzt, dass auf diesem in der Datei, die alle die norwegischen Zeichen komisch aussehen.

Ich mache wahrscheinlich die oben in einige dumme Art und Weise. Irgendwelche Vorschläge, wie man es beheben?

War es hilfreich?

Lösung

Warum schreiben Sie die XML-Erste, der einen Memorystream und dann, dass der Strom auf den eigentlichen Datei zu schreiben? Das ist ziemlich ineffizient. Wenn Sie direkt auf die Filestream schreiben sollte es funktionieren.

Wenn Sie immer noch die doppelte Schreib, für welchen Gründen auch immer tun wollen, wählen Sie eine von zwei Dinge. Entweder

  1. Stellen Sie sicher, dass die Stream und Streamwriter Objekte, die Sie verwenden alle die gleichen Codierung als die, die Sie mit dem XmlWriter verwendet (und nicht nur die Streamwriter, wie jemand anderes vorgeschlagen) oder

  2. Verwenden Sie Stream / Streamwriter nicht. Stattdessen kopieren Sie einfach den Strom auf Byte-Ebene ein einfaches byte [] und Stream.Read/Write verwenden. Das wird sein, btw, viel effizienter sowieso.

Andere Tipps

Sowohl Ihre Stream und Ihre Stream verwenden UTF-8, weil Sie nicht die Codierung angeben. Das ist, warum die Dinge sind beschädigt zu werden.

Wie tomasr sagte, mit einem Filestream mit zu beginnen wäre einfacher - aber auch hat Memory die handliche „WriteTo“ Methode, die Sie ganz einfach kopieren Sie sie in einen Filestream läßt

.

Ich hoffe, dass Sie eine using-Anweisung in Ihrem realen Code haben, nebenbei gesagt - Sie wollen nicht Ihre Datei-Handle offen lassen, wenn etwas schief geht, während Sie es gerade schreiben

.

Jon

Sie müssen die Codierung jedes Mal setzen Sie einen String schreiben oder Binär-Daten als String lesen.

    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();

Wie in oben Antworten erwähnt, hier das größte Problem ist die Encoding, die nicht näher bezeichnet, da auf Verzug geraten wird.

Wenn Sie keine Encoding für diese Art der Konvertierung angeben, wird der Standard von UTF-8 verwendet - was oder kann Ihr Szenario nicht mithalten kann. Sie sind auch die Daten unnötig Umwandlung indem sie sie in eine MemoryStream schieben und dann hinaus in einem FileStream.

Wenn Sie Ihre Originaldaten nicht UTF-8 sind, wird hier, was passiert ist, dass der erste Übergang in die MemoryStream versuchen wird, unter Verwendung von Standard-Encoding von UTF-8 zu entschlüsseln - und korrupten Daten als Ergebnis. Wenn Sie dann auf die FileStream schreiben, die auch UTF-8 als Codierung standardmäßig verwendet wird, bleiben Sie einfach, dass die Korruption in die Datei.

Um das Problem zu beheben, müssen Sie wahrscheinlich Encoding in Ihre Stream Objekte angeben.

Sie können tatsächlich den MemoryStream Prozess ganz überspringen, auch - was schneller sein und effizienter zu gestalten. Ihr aktualisierte Code aussehen könnte etwas mehr wie:

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();

Welche Codierung verwenden Sie die Ergebnisdatei für die Anzeige? Wenn es nicht in ISO-8859-1 ist, wird es nicht korrekt angezeigt werden.

Gibt es einen Grund diese spezielle Codierung zu verwenden, statt zum Beispiel UTF8?

Nach der Untersuchung, das ist das funktioniert am besten für mich:

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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top