Meine Anwendung wird von Web-Service einiger XML-Dateien wie folgen aus:Kombinieren Sie einige XML-Dateien: Codierung Probleme
<?xml version="1.0" encoding="iso-8859-1"?>
<root>
<person>
<!— some elements here —>
</person>
<person>
<!— some elements here —>
</person>
</root>
ich kombiniere all diese Dateien in einer Datei, die all Personen unter einem Wurzelelement zu verbinden. Wenn ich Code wie folgt verwenden:
var readers = files.Select(XmlReader.Create).ToList();
var writer = XmlWriter.Create("final.xml");
...
writer.WriteStartDocument();
writer.WriteStartElement("root");
foreach (var reader in readers)
{
reader.MoveToContent();
reader.Read();
while (!reader.EOF)
{
string elementName = reader.Name;
if (elementName.Equals("person", StringComparison.OrdinalIgnoreCase))
{
writer.WriteNode(reader, false);
}
else
{
reader.Read();
}
}
}
writer.WriteEndElement();
writer.WriteEndDocument();
...
//dispose all readers and writers
Es funktioniert ok und in der endgültigen Datei habe ich utf-8 in xml prolouge. Aber wenn ich die Leser wie folgt zu erstellen:
var readers = files.Select(x => XmlReader.Create(new StreamReader(x))).ToList();
Ich habe die gleichen utf-8 in xml prolouge aber es ist beschädigte Daten in der endgültigen Datei. Zum Beispiel, anstelle von Symbol å Ich habe . Ich habe versucht, den Grund für dieses Problem Joel's article about encodings lesen, aber es gibt kein Ergebnis. Warum funktioniert das so?
AFAIK Unicode ein Zeichen gesetzt und utf-8/iso-8859-1 sind Codierungen. Wird Unicode in beiden Fällen verwendet? Bedeutet eine falsche Kodierung, dass ich falsche Zahlen aus Binärdaten erhalte und diese Zahlen schließlich falsch interpretiert werden, wenn Unicode-Zeichensatz verwendet wird? – mtkachenko
@mtkachenko Ihre Datei (die eine Ladung von Bytes ist) wird in eine Zeichenfolge (Unicode-Zeichen) decodiert und dann erneut codiert, wenn Sie sie erneut in eine Datei schreiben. Die Decodierung ist was hier falsch läuft, Sie bekommen die falschen Zeichen, weil Ihr 'StreamReader' den falschen Decoder benutzt (es wird standardmäßig auf UTF-8 gesetzt, da keine Stückliste etwas anderes anzeigt). –
Prozess: Bytes -> zu Zahlen basierend auf Codierung -> zu String basierend auf Character Set. Also ist der 2. Schritt falsch und schließlich auch der 3., oder? Falscher weg hier: bytes-> utf-8-> unicode. Guter Weg: bytes-> iso-8859-1-> Unicode (oder Teilmenge von Unicode). Ist es richtig? – mtkachenko