Encoding Problem beim einlesen einer Xml-File

B

bfm66

Hallo!
Da mir so schön geholfen wurde möchte ich nochmal eine weitere Frage stellen. Ich habe das Problem das Sonderzeichen nicht korrekt angezeigt werden. Ich lese eine Xml-Datei ein mittels XmlWriter und schreibe eine neue Xml-Datei. Das Encoding beim schreiben ist Encoding.Default, also UTF-8. Beim einlesen der Xml-Datei (ausgangsencoding: iso-8859-15) wird das Encoding mit meiner Methode nicht korrekt geändert.

Hier die Methode die das Encoding beim einlesen von iso-8859-15 in UTF-16 ändern soll. (Der Code ist C#, wusste nicht genau ob das hier reingehört)

Code:
  private static void EncodeText(ref string xml)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            if (doc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
            {
                XmlDeclaration xmlDeclaration = (XmlDeclaration)doc.FirstChild;
                xmlDeclaration.Encoding = "UTF-16";
            }
            xml = doc.OuterXml;
         }

Wenn ich im Einzelschritt durch die Methode springe wird die Declaration geändert und es steht danach encoding = UTF-16 da. Nur ändert das leider nicht das Problem mit den Sonderzeichen. Hängt das damit zusammen das ich nur quasi nen string ersetze und garnicht neu codiert wird?

Verstehe das nicht ganz, bitte um Hilfe!
Danke vielmals im Vorraus.
 
Hab den XMLWriter nie benutzt, aber deine Einschätzung dürfte korrekt sein. Du ersetzt nur den Encoding-String.

Du musst eigentlich über die Encoding.UTF16-Klasse den kompletten XML-Text umwandeln lassen (in der Datei ist er ja Iso-Dingens).

So in etwa:
Encoding.Convert( Encoding.Default, Encoding.Unicode, string-als-byte-array )
 
Zuletzt bearbeitet:
Hab den XMLWriter nie benutzt, aber deine Einschätzung dürfte korrekt sein. Du ersetzt nur den Encoding-String.

Du musst eigentlich über die Encoding.UTF16-Klasse den kompletten XML-Text umwandeln lassen (in der Datei ist er ja Iso-Dingens).

So in etwa:
Encoding.Convert( Encoding.Default, Encoding.Unicode, string-als-byte-array )

Danke, bin erstmal einen Schritt weiter. Habe mithilfe MSDN meine Konvertierung geschrieben:

Code:
private static void EncodeText(ref string xml)
        {
           XmlDocument doc = new XmlDocument();          
           doc.LoadXml(xml);
           xml = doc.OuterXml;
            Encoding SourceEncoding = Encoding.GetEncoding(xml);
            Encoding TargetEncoding = Encoding.UTF8;
            byte[] LatinBytes = SourceEncoding.GetBytes(xml);
            byte[] UnicodeBytes = Encoding.Convert(SourceEncoding, TargetEncoding, LatinBytes);
            char[] LatinChar = new char[SourceEncoding.GetCharCount(UnicodeBytes, 0, UnicodeBytes.Length)];
            SourceEncoding.GetChars(UnicodeBytes, 0, UnicodeBytes.Length, LatinChar, 0);
            xml = new string(LatinChar);
}
Habe rausbekommen, dass wenn ich die Ausgangs XML-Datei mit UTF8 speichere, somit erstmal weiß, dass mein SourceEncoding UTF8 wirklich auch ist.
Weil die Funktion GetEncoding() liest bloß den string des Xml Konten aus und anscheinend ist meine Ausgangs XML-Datei gar nicht ISO-8859-15.
Das heißt:
Die Konvertierung mit korrekter Anzeige von Sonderzeichen klappt bloß, wenn ich vorher das richtige Encoding Format meiner XML-Ausgangsdatei weiß.
GetEncoding gaukelt mir da ein Format vor, was eigentlich nicht korrekt ist.

Meine Frage nun, wenn ich das richtige Encoding rauskriege funktioniert die Konvertierungg von Encoding A zu Encoding B. (unnknow to Unicode).

Ich hoffe ihr könnt mich verstehen, aber vielen Dank für den tollen Ansatz :)
 
Hi.
Weil die Funktion GetEncoding() liest bloß den string des Xml Konten aus
Was genau das ist was diese Methode tun sollte. Invalide Eingabedateien können meist nicht sinnvoll verarbeitet werden.
Meine Frage nun, wenn ich das richtige Encoding rauskriege funktioniert die Konvertierungg von Encoding A zu Encoding B. (unnknow to Unicode).
Generell ist das nicht möglich. Es gibt eine Bibliothek von Mozilla die versucht die Kodierung zu ermitteln: http://code.google.com/p/ude/

Gruß
 
Ah okay, also habe ich zunächst mit normalen Programmier Werkzeugen keine Chance an das eigentliche Encoding zu kommen.

Danke vielmals für Eure Hilfe, ich werde einen anderen Weg finden müsssen.
 
Zurück