bernd: encoding, Browserverhalten, UTF-8/UTF-16

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

  1. 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

    1. 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

      1. 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

        --
        „Solang wir noch tanzen können
        und richtig echte Tränen flennen,
        ist noch alles offen,
        ist noch alles drin.“
        (Gundermann)
        1. //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

          --
          „Solang wir noch tanzen können
          und richtig echte Tränen flennen,
          ist noch alles offen,
          ist noch alles drin.“
          (Gundermann)
        2. 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

          1. 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

            --
            „Solang wir noch tanzen können
            und richtig echte Tränen flennen,
            ist noch alles offen,
            ist noch alles drin.“
            (Gundermann)
            1. Im Grunde ging es mir aber nur darum, das Dokument falsch kodiert
              abzuspeichern

              Warum sollte jemand das tun?

              Aus Versehen?
              Unbewusst falsche Werkzeuge (Editoren) benutzt?

              Nicht jeder weiß so viel und arbeitet so konzentriert wie "wir" :-)

            2. 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
              abzuspeichern

              Warum 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