Entwickler-Ecke

IO, XML und Registry - UTF16 Xml-Datei einlesen


danielf - Fr 10.09.10 07:48
Titel: UTF16 Xml-Datei einlesen
Hallo,

ich bekomme Xml Dateien die als UTF-16 daklariert sind (<?xml version="1.0" encoding="utf-16" ?>).

Diese kann ich weder im IE anzeigen lassen ("Switch from current encoding to specified encoding not supported.") noch mit XDocument laden (XDocument.Load(path..)).

Hat einer eine Idee wie man die dennoch laden kann und was das Problem ist?

Gruß Daniel

PS: Beim schreiben des Textes ist mir noch eine Idee gekommen, das Dokument mit der File Klasse einzulesen und dann zu parsen. Das hat funktioniert (

C#-Quelltext
1:
2:
3:
4:
5:
string dealPath = @"c:\PFS_1-135-1_09-09-2010_14-07-50.txt";

            string xmlContent = File.ReadAllText(dealPath);

            var xmlDoc = XDocument.Parse(xmlContent);
). Wäre trotzdem Dankbar wenn einer eine Idee hat warum das Probleme macht und ob man es auch mit XDocument.Load(path + settings) laden könnte.


Kha - Fr 10.09.10 10:57

Eine Beispiel-Datei wäre schön :) . Als Little-Endian mit korrektem BOM kann ich das nicht nachstellen.


danielf - Fr 10.09.10 11:45

Ich habe eine Testdatei angelegt mit folgendem Inhalt:

XML-Daten
1:
2:
3:
<?xml version="1.0" encoding="utf-16" ?>
<STPMessage>
</STPMessage>


und sie versucht mit folgendem Code zu laden:

C#-Quelltext
1:
var doc = XDocument.Load(@"C:\test2.xml");                    


was zur folgenden Exception führt:

Quelltext
1:
2:
XmlException wurde nicht behandelt.
Keine Unicodebyte-Reihenfolgemarkierung. Es kann nicht zu Unicode gewechselt werden.


InnerException gibt es keine.

Gruß

PS: System ist Win Server 2003, .NET Framework 4.0 ist installiert, Solution läuft auf 3.5


Kha - Fr 10.09.10 13:41

Uh, von einem Zitat kann ich leider weder Encoding noch BOM ablesen :) . Die Fehlermeldung hört sich nach UTF-16 (LE?) ohne BOM an, das ist aber wirklich keine gute Idee:
http://en.wikipedia.org/wiki/UTF16 hat folgendes geschrieben:
The UTF-16 BOM is optional and big-endian should be used if it is missing, but omitting it is not recommended (most Windows software will assume little-endian). The BOM is not optional in UCS-2.

So eine Datei erkennen sowohl VS als auch File.ReadAllText bei mir als UTF8, es kommt also nichts wirklich Sinnvolles dabei heraus.


danielf - Fr 10.09.10 14:00

Hmm, wahrscheinlich ist dann genau der Fehlende BOM das Problem. Leider kann ich bei den erzeugten Dateien nichts ändern und da es über einlesen und parsen funktioniert werden ich es dabei belassen.

Dennoch weiß ich nun wieder mehr :D

Danke


Kha - Fr 10.09.10 14:21

Wenn dir das Encoding bekannt ist, kannst du es als Fallback eintragen:

C#-Quelltext
1:
XDocument.Load(new StreamReader(..., Encoding.Unicode))                    

Zitat:
It automatically recognizes UTF-8, little-endian Unicode, and big-endian Unicode text if the file starts with the appropriate byte order marks. Otherwise, the user-provided encoding is used.