encoding, Browserverhalten, UTF-8/UTF-16
bernd
- xml
0 Daniel Thoma0 bernd
Hallo,
wenn ich in einem XML-Dokument in der Deklaration sage, dass das Dokument
iso-8859-1 kodiert ist, ich es aber als utf-16 abspeicher, dann
schmeißt mir der IE beim Anzeigen der Datei einen Fehler. Der
Mozilla scheint sich nicht dafür zu interessieren. Der IE reagiert
auch darauf, wenn ich ihm sage, dass mein Dokument utf-8 kodiert ist
und ich einen Umlaut reinschreibe. Er sagt dann, das da ein
ungültiges Zeichen ist.
Welcher Browser verhält sich denn hier korrekt?
Weiterhin habe ich eine Frage zu
http://de.selfhtml.org/xml/regeln/zeichen.htm#zeichensatz.
Da steht, dass man, wenn das Dokument utf-8 oder utf-16 kodiert
ist, "alle Zeichen, die oberhalb des ASCII-Zeichensatzes liegen"
mit numerischen Entities umschreiben muss.
Das verstehe ich nicht. UTF-8/-16 ist doch Unicode, warum muss ich
da Entities nehmen?
bernd
Hallo bernd,
iso-8859-1 kodiert ist, ich es aber als utf-16 abspeicher, dann
schmeißt mir der IE beim Anzeigen der Datei einen Fehler.
Welches Verhalten korrekt ist, hängt davon ab, ob dadurch Bytes entstehen, die keine zulässigen iso-8859-Zeichen sind. Vermutlich sind die 0-Bytes unzulässig oder zumindest Zeichen, die XML nicht erlaubt.
Der IE reagiert
auch darauf, wenn ich ihm sage, dass mein Dokument utf-8 kodiert ist
und ich einen Umlaut reinschreibe.
Ist der Umlaut korrekt als utf-8 kodiert?
Weiterhin habe ich eine Frage zu
http://de.selfhtml.org/xml/regeln/zeichen.htm#zeichensatz.
Da steht, dass man, wenn das Dokument utf-8 oder utf-16 kodiert
ist, "alle Zeichen, die oberhalb des ASCII-Zeichensatzes liegen"
mit numerischen Entities umschreiben muss.
Das ist Unsinn. Ich kann mir höchstens vorstellen, dass gemeint ist, dass man das in der Praxis so machen muss, wenn man einen Editor hat, der kein UTF-8 unterstüzt. Aber selbst dann hilft es nicht unbedingt, iso-... anzugeben, der Editor verwendet ja u.U. einen anderen Zeichensatz, z.B. einen Windowsspezifischen.
Grüße
Daniel
Hallo Daniel,
danke für deine Antwort. Ich wollte nur noch zwei Beispiele liefern,
damit etwas klarer wird, wovon ich rede. Die Datei wird _nicht_ so
gespeichert, wie ich es in der Deklaration angebe. Das das nicht
richtig ist weiß ich, es geht mir aber mehr um das _richtige_ Verhalten
bzw. wie und ob die entspr. Browser das erkennen (encode). Leider
kenne ich mich da nicht gut aus und weiß leider nicht, was die Spec
dazu sagt.
//Datei wird nicht utf-8 kodiert abgespeichert (ASCII).
<?xml version="1.0" encoding="utf-8" ?>
<abc>
Schöne Grüße.
</abc>
IE: mekert
Moz: zeigt die Umlaute als ? an.
//Datei wird nicht iso-8859-1 kodiert abgespeichert (Unicode).
<?xml version="1.0" encoding="iso-8859-1" ?>
<abc>
Hallo Welt.
</abc>
IE: mekert
Moz: zeigt alles normal an
Kann der IE besser mit Kodierungsfehler umgehen oder ist das nicht
so wichtig?
Grüße
bernd
bernd,
//Datei wird nicht utf-8 kodiert abgespeichert (ASCII).
<?xml version="1.0" encoding="iso-8859-1" ?>
Na dann schaun wir mal rein. In diese Zeile:
Schöne Grüße.
U+0053 U+0063 U+0068 U+00F6 U+006E U+0065 U+0020 U+0047 U+0072 U+00FC U+00DF U+0065 U+002E
Als ISO 8859-1 codiert: 53 63 68 F6 6E 65 20 47 72 FC DF 65 2E
Als UFT-8 decodiert: U+0053 U+0063 U+0068 ... Bis hierhin alles OK.
Aber dann kommt F6 6E 65 20, binär 11110110 01101110 01100101 00100000. Die Bitfolge 11110xxx sagt, dass es sich um ein Zeichen aus dem Bereich U+10000 bis U+1FFFFF handelt, wobei die nächsten drei Bytes mit dazugehören und die Form 10xxxxxx 10xxxxxx 10xxxxxx haben müssen. [RFC 2279]
Die Bytefolge F6 6E 65 20 ist in UTF-8 nicht gültig.
„Es ist ein kritischer Fehler, wenn für ein XML-Entity (durch Vorgabewert, Kodierungsdeklaration oder Protokoll) eine bestimmte Kodierung angegeben wird, das Entity jedoch Oktett-Folgen enthält, die in dieser Kodierung nicht zulässig sind.“ [XML §4.3.3]
„Kritischer Fehler (fatal error)
[Definition: Ein Fehler, den ein konformer XML-Prozessor erkennen und an das Anwendungsprogramm melden muss. Nach der Erkennung eines kritischen Fehlers darf der Prozessor die Verarbeitung fortsetzen, um nach weiteren Fehlern zu suchen und diese dem Anwendungsprogramm zu melden. Um die Fehlerkorrektur zu unterstützen, darf der Prozessor nichtverarbeitete Daten des Dokuments (mit vermischtem Text und Markup) dem Anwendungsprogramm zur Verfügung stellen. Wenn ein kritischer Fehler aufgetreten ist, darf ein Prozessor die normale Verarbeitung nicht fortsetzen. Dies heißt insbesondere, dass er keine weiteren Daten oder Informationen über die logische Struktur des Dokuments an das Anwendungsprogramm weiterleiten darf, wie es normalerweise geschieht.]“ [XML §1.2]
Das Verhalten
IE: mekert
ist denmach also korrekt.
Das Verhalten
Moz: zeigt die Umlaute als ? an.
ist falsch.
//Datei wird nicht iso-8859-1 kodiert abgespeichert (Unicode).
Was heißt „Unicode“? Das ist keine Codierung.
Gunnar
//Datei wird nicht utf-8 kodiert abgespeichert (ASCII).
<?xml version="1.0" encoding="iso-8859-1" ?>
Argl, das Falsche reinkopiert. Muss
<?xml version="1.0" encoding="utf-8" ?>
heißen (tat es ja bei bernd auch), sonst ergibt auch mein ganzes Geschriebene keinen Sinn.
Gunnar
Hallo Gunnar,
//Datei wird nicht iso-8859-1 kodiert abgespeichert (Unicode).
Was heißt „Unicode“? Das ist keine Codierung.
Entschuldige meine Unaufmerksamkeit. Ich meinte das "Unicode", so wie
es die meisten verstehen und handhaben, also 16 Bit für ein Zeichen
ohne Surrogate. Der Ultra Edit bietet eine Konvertierung von ASCII
nach Unicode an, womit natürlich keine Kodierung von Unicode
(UTF-x) gemeint ist, sondern einfach nur 16 Bit / Zeichen.
Wenn in der MSDN von Unicode die Rede ist, dann meinen die auch
16 Bit (wchar_t), was ja auch nicht richtig ist, da die Größe von
wchar_t nicht unbedingt 16 Bit sein muss. Wie auch immer, ich meinte
halt 16 Bit / Zeichen.
Im Grunde ging es mir aber nur darum, das Dokument falsch kodiert
abzuspeichern und das Verhalten der Browser zu beobachten bzw.
festzustellen, dass die Kodierung eines Dokumentes schon
vorher grob ermittelt werden muss (BOM oder ähnliches) und dass
anschließend die Kodierung mit der Angabe in der Deklaration
verglichen werden muss. Ich war mir einfach nicht klar darüber, wie
das mit der Erkennung der Kodierung abläuft, wenn ein Parser das
Dokument einliest.
Danke für deine Erklärung und den guten Links.
bernd
bernd,
Wie auch immer, ich meinte halt 16 Bit / Zeichen.
Also UTF-16?
Im Grunde ging es mir aber nur darum, das Dokument falsch kodiert
abzuspeichern
Warum sollte jemand das tun?
(Ich hab das mal gemacht, um mit Textpad (nicht Unicode-fähig) ein UFT-8-codiertes Dokument zu erzeugen.)
Gunnar
Im Grunde ging es mir aber nur darum, das Dokument falsch kodiert
abzuspeichernWarum sollte jemand das tun?
Aus Versehen?
Unbewusst falsche Werkzeuge (Editoren) benutzt?
Nicht jeder weiß so viel und arbeitet so konzentriert wie "wir" :-)
Hallo Gunnar,
Wie auch immer, ich meinte halt 16 Bit / Zeichen.
Also UTF-16?
Ja du hast Recht. Habe mir den Artikel nochmal durchgelsesen.
http://www.activevb.de/rubriken/kolumne/kol_20/unicode.html (Unicode-Unterstützung).
Genau diese Art der Handhabung meinte ich, also dass man nur die
Zeichen der BMP nutzt.
Im Grunde ging es mir aber nur darum, das Dokument falsch kodiert
abzuspeichernWarum sollte jemand das tun?
Möglicherweise öffnet ein Kollege das Dokument und speichert es
unwissentlich falsch kodiert ab;) Die Frage, die sich mir stellte
war, ob der Parser das erkennt und wie er darauf zu reagieren hat.
Grüße
bernd