Raucherkrebs: Kodierungsformat

Hallo Forum,

ich bräuchte mal Hilfe hinsichtlich Kodierungsformaten.
Schreibe am Freitag eine Klausur und habe das mit dem Unicode noch nicht so raus.

In meinen Unterlagen steht:

<zitat>Prinzipiell kann eine Kodierung mehrere Kodierungsformate definieren und das kanonische Kodierungsformat muss nicht darunter sein. Unicode 3.0 beispielsweise definiert nur zwei Kodierungsformate, nämlich UTF-8 und UTF-16 wobei UTF für Unicode Tranfer Format steht. UTF-8 hat eine Kodeeinheit von 8 Bits Länge und repräsentiert Kodepositionen mit einer bis vier Kodeeinheiten. Utf-16 hat eine Kodeeinheit von 16 Bits Länge und repräsentiert Kodepositionen mit einer bis zwei Kodeeinheiten.</zitat>

Könnte mir das freundlicherweise mal jemand mit anderen Worten erklären?
Was heißt "...und repräsentiert Kodepositionen mit einer bis vier Kodeeinheiten." ?

Was ist ein kanonisches Kodierungsformat?

  1. 你好 Raucherkrebs,

    Könnte mir das freundlicherweise mal jemand mit anderen Worten erklären?

    Mit Kodierung ist hier wohl die Menge aller Zeichen gemeint. Und das
    Kodierungsformat ist dann die Methode, wie ein Zeichen in Bits verpackt
    wird.

    Was heißt "...und repräsentiert Kodepositionen mit einer bis vier
    Kodeeinheiten." ?

    Ein in UTF-8 kodiertes Zeichen kann 1 bis 6 (nicht 4! Das ist ein Fehler,
    der ISO-Standard spricht eindeutig von 6) Byte belegen. Dabei gibt es
    bestimmte “Markierungsbits”, die die Laenge des Zeichens anzeigen. Das ist
    hier gemeint.

    Was ist ein kanonisches Kodierungsformat?

    Damit wird das Format bezeichnet, dass jedes Zeichen mit genau einer
    Kodeeinheit Abbilden kann.

    再见,
     CK

    --
    Die Summe zweier gerade Primzahlen ist immer eine Quadratzahl.
    http://wwwtech.de/
    1. Habe mir schon zig Seiten angeguckt. Die beste, die ich gefunden habe ist: http://www.informatik.hu-berlin.de/~obecker/Lehre/SS2002/XML/03-unicode.html

      Aber verstehen tue ich es immer noch nicht. Wann wird ein UTF-8 kodiertes Zeichen mit einer Kodeeinheit kodiert und wann mit 6 ?
      Wovon ist das abhängig?

      Könntest du mir das mit den Sugorraten noch mal erklären? Wozu sind die nötig? Da kann man doch bessser gleich UTF-16 benutzen!

      1. Raucherkrebs,

        Wann wird ein UTF-8 kodiertes Zeichen mit einer Kodeeinheit kodiert und wann mit 6 ?
        Wovon ist das abhängig?

        Lies nochmal Seite 11 von [Becker] oder auch Abschnitt 2 von [RFC 2279].

        Da kann man doch bessser gleich UTF-16 benutzen!

        Lies nochmal Seite 13 von [Becker] .

        Gunnar

        --
        „Solang wir noch tanzen können
        und richtig echte Tränen flennen,
        ist noch alles offen,
        ist noch alles drin.“
        (Gundermann)
    2. Aufgabe:

      Was ist die Kodierung des BOM FEFF unter dem Kodierungsschema UTF-8? Überprüfen Sie, ob das Vorausschicken eines BOM ausreicht, um zwischen den bisher besprochenen Kodierungsschemata zu differenzieren.

      Ich habe zwar die Lösung für diese Aufgabe, aber vertstehen tue ich sie nicht. Könnte mir mal jemand die Lösung erklären?

      1. Hallo Krebs,

        Was ist die Kodierung des BOM FEFF unter dem Kodierungsschema UTF-8?

        Das Byte-Order Mark ist dafür da, in einem Zeichenstrom die Reihenfolge der Bytes festzustellen. U+FEFF wird hier als Byte-Order Mark verwendet.

        Wandeln wir mal U+FEFF in UTF-8 um:

        Wir brauchen dafür laut UTF-8 drei Bytes, an die X-Stellen kommt unser Wert: 1110xxxx 10xxxxxx 10xxxxxx

        0xFEFF ist 0b1111111011111111, wenn wir das dann in obiges Schema reinstopfen kriegen wir drei vollständige Bytes:

        1110xxxx 10xxxxxx 10xxxxxx
            1111   111011   111111
        11101111 10111011 10111111

        0b111011111011101110111111 ist 0xEFBBBF, was sehr viel bequemer zu schreiben ist.

        Überprüfen Sie, ob das Vorausschicken eines BOM ausreicht, um zwischen den bisher besprochenen Kodierungsschemata zu differenzieren.

        Ich weiß nicht, was für Kodierungsschemata da schon vorher besprochen wurden, aber ich gehe einfach mal von UTF-8 und UTF-16 aus. Berechnen wir also mal die Bytes des BOMs in UTF-16:

        0xFEFF ist in 0b1111111011111111, in Bytes 11111110 11111111

        Wir zählen durch: Zwei Bytes, insgesamt 16 Bit. Wenn ich UTF-16 richtig verstehe, dann wird U+FEFF also genau so als 0xFEFF gespeichert.

        Jetzt kommen wir wieder zur Reihenfolge der Bytes: U+FEFF ist natürlich nur dann in der Reihenfolge FE FF gespeichert (oder übertragen), wenn das System im Big Endian Modus arbeitet. Im Little Endian Modus ist es FF FE. U+FFFE wäre anscheinend niemals ein tatsächliches Zeichen in Unicode.

        Wenn man jetzt also das Kodierungsschemata eines Bytestroms mit BOM vorne daran rausfinden will, guckt man sich einfach die ersten Bytes an:

        EF BB BF  .. ist UTF-8.
        FE FF     .. ist UTF-16 in Big Endian.
        FF FE     .. ist UTF-16 in Little Endian, es empfiehlt sich also, die Bytes umzudrehen.

        (Und was ist mit UTF-8 in Little Endian? So wie ich das verstehe, gibt es Little Endian in UTF-8 gar nicht, zudem wäre BF BB EF anscheinend gar kein richtiges UTF-8-Zeichen, meine ich. Aber das mögen Informiertere als ich erklären)

        Tim

        1. Hi,

          Wenn man jetzt also das Kodierungsschemata eines Bytestroms mit BOM vorne daran rausfinden will, guckt man sich einfach die ersten Bytes an:

          Ein Schema, mehrere Schemata (bzw. mehrere Schemen, mehrere Schemas, der Duden läßt alle 3 Pluralformen zu, Singular ist aber immer Schema).

          EF BB BF  .. ist UTF-8.
          FE FF     .. ist UTF-16 in Big Endian.
          FF FE     .. ist UTF-16 in Little Endian, es empfiehlt sich also, die Bytes umzudrehen.

          (Und was ist mit UTF-8 in Little Endian? So wie ich das verstehe, gibt es Little Endian in UTF-8 gar nicht, zudem wäre BF BB EF anscheinend gar kein richtiges UTF-8-Zeichen, meine ich. Aber das mögen Informiertere als ich erklären)

          Da UTF-8 nicht aus Bytepaaren, sondern aus Einzelbytes besteht, gibt es kein Reihenfolgeproblem innerhalb des Paares.

          Zu klären wäre jetzt m.E. noch, ob
          FE FF ... bzw. FF FE ... eine zulässige UTF-8 Kodierung eines Zeichens sein kann.
          Dies ist nicht der Fall, der höchste Wert eines ersten Bytes einer UTF-8 Kodierung ist F4. FE und FF können also nicht vorkommen.

          Und ob
          EFBB BFxx als erste Bytepaare eines UTF-16 Strings vorkommen dürfen.
          Wenn ich das richtig sehe, muß bei UTF-16 immer ein ByteOrderMark FFEF bzw. FEFF am Anfang stehen, so daß das auch nicht der Fall sein kann.

          Oder liege ich da falsch?

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. Hallo Andreas,

            EFBB BFxx als erste Bytepaare eines UTF-16 Strings vorkommen dürfen.
            Wenn ich das richtig sehe, muß bei UTF-16 immer ein ByteOrderMark FFEF bzw. FEFF am Anfang stehen, so daß das auch nicht der Fall sein kann.
            Oder liege ich da falsch?

            Ähm, ja, ein BOM ist nicht zwangsläufig am Anfang vorgesehen. Aber ja, sollte man mal überprüfen:

            EFBB BFxx kann schonmal nicht eine zwei Zwei-Byte-Einheit in UTF-16 sein, da diese mit mit 0xD starten. Kann EFBB eine legale Zwei-Byte-Einheit in UTF-16 sein? Das wäre dann U+EFBB, das würde dann in die Private Use Area fallen, in der noch keine Zeichen zugewiesen sind:
            http://www.unicode.org/charts/PDF/UE000.pdf

            Es könnte natürlich noch in Zukunft so sein, aber ich denke, da wird hoffentlich jemand clever mitdenken, wie bei U+FFFE, das im Unicode-Standard niemals ein legales Zeichen sein wird.

            Tim

    3. Hallo Christian,

      Ein in UTF-8 kodiertes Zeichen kann 1 bis 6 (nicht 4! Das ist ein Fehler,
      der ISO-Standard spricht eindeutig von 6) Byte belegen.

      RFC 3629 beschränkt die Bytes aber nur auf vier Bytes (»Octets«), wenn ich mich recht erinnere, um dieselbe Menge an Zeichen wie UTF-16 zu erreichen. Deswegen wahrscheinlich dieses häufige Mißverständnis.

      Tim

      1. Hi,

        Ein in UTF-8 kodiertes Zeichen kann 1 bis 6 (nicht 4! Das ist ein Fehler,
        der ISO-Standard spricht eindeutig von 6) Byte belegen.
        RFC 3629 beschränkt die Bytes aber nur auf vier Bytes (»Octets«), wenn ich mich recht erinnere, um dieselbe Menge an Zeichen wie UTF-16 zu erreichen. Deswegen wahrscheinlich dieses häufige Mißverständnis.

        Nur mal so als Idee: sind da vielleicht nur ältere Versionen des Unicode berücksichtigt? Bei denen es noch nicht so viele Code Points gab wie im aktuellen 4.0.1?

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo Andreas,

          Nur mal so als Idee: sind da vielleicht nur ältere Versionen des Unicode berücksichtigt? Bei denen es noch nicht so viele Code Points gab wie im aktuellen 4.0.1?

          Glaube ich nicht, die in Unicode definierten Code Points liegen meines Wissens irgendwo bei 100.000, es gibt aber Platz für über eine Million. Ich glaube, die Differenzen liegen eher darin, daß ISO/IEC und das Unicode Konsortium verschiedene Werte für »Platz« haben. Aber das sind so Gegenden der Standardisierung, wo ich nicht mal informiert sein will. ;)

          Tim

          1. Hello,

            Glaube ich nicht, die in Unicode definierten Code Points liegen meines Wissens irgendwo bei 100.000, es gibt aber Platz für über eine Million.

            Das heißt also, wenn wir auf dem Mars Lebenwesen mit Schriftsprache entdecken, und die sind sich da genauso uneins, wie wir auf der Erde, könnte es schon wieder eng werden? *gg*

            Aber nun mal der ernstgemeinte Teil meiner Frage:
            Was muss ich denn ins HTML-File scheiben mit meinem ASCII+ -Editor, damit das Zeichen vernünftig übertragen wird und wo liegt es in welchem Format vor?

            Einfacher Auslöser für diese Frage: http://www.arbeitsagentur.de/vam/vamController/SchnellsucheAS/anzeigeSchnellsuche ein Jobangebot aussuchen und dann in die Druckansicht umschalten. Diese dann per email versenden.

            Und bitte nun den Zeichensalat anschauen

            Ausprobiert mit IE5.5x und IE6.x und dem jeweils mitgelieferten Outlook Express

            Woran liegt nun dieser Salat?

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Moin!

              Und bitte nun den Zeichensalat anschauen

              Was denn für einen Zeichensalat? Die HTML-Seite selbst ist UTF-8, alle Umlaute sind "etwas seltsam" (aber für UTF-8 absolut in Ordnung).

              - Sven Rautenberg

              1. Hello,

                Und bitte nun den Zeichensalat anschauen

                Was denn für einen Zeichensalat? Die HTML-Seite selbst ist UTF-8, alle Umlaute sind "etwas seltsam" (aber für UTF-8 absolut in Ordnung).

                Die gehören aber so scheinbar nicht in die email, da der Client nun seinerseits Quoted Printable daraus macht.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
      2. 你好 Tim,

        Ein in UTF-8 kodiertes Zeichen kann 1 bis 6 (nicht 4! Das ist ein Fehler,
        der ISO-Standard spricht eindeutig von 6) Byte belegen.

        RFC 3629 beschränkt die
        Bytes aber nur auf vier Bytes (»Octets«), wenn ich mich recht erinnere,
        [...]

        Ja, das weiss ich, aber eine RFC ist kein Standard. Und die RFC weist _auch_
        darauf hin, dass der Standard 6 Byte beschreibt :)

        再见,
         CK

        --
        Es gibt keinen Ort, wo der Geist zu finden waere. Er ist wie die Fussspuren der Voegel am Himmel.
        http://wwwtech.de/
        1. Hallo Christian,

          Ja, das weiss ich, aber eine RFC ist kein Standard. Und die RFC weist _auch_
          darauf hin, dass der Standard 6 Byte beschreibt :)

          Okeh. Aus dem Anhang C.3 des Unicode Standard:
            »The definition of UTF-8 in Annex D of ISO/IEC 10646-1:2000 also allows for
            the use of five- and six-byte sequences to encode characters that are
            outside the range of the Unicode character set; those five- and six-byte
            sequences are illegal for the use of UTF-8 as an encoding form of Unicode
            characters.«

          Worauf ich hinaus will: Der Unicode Standard des Unicode Konsortiums und der Standard ISO/IEC 10646-1 sind eigentlich deckungsgleich, trotzdem gibt es aber Unterschiede zwischen den beiden, auch wenn sie sehr in Abstimmung zueinander entwickelt werden. Man kann hier natürlich sikutieren, ob das Unicode Konsortium überhaupt berechtigt ist einen »Standard« herauszugeben, da es aber auf seiner Homepage nur vom Unicode Standard spricht, halte ich diesen Sprachgebrauch für zulässig. Wenn jetzt jemand von Unicode spricht, denkt man an den Unicode Standard mit seinen 2^20 + 2^16 zulässigen Zeichen, nicht unbedingt an den Standard ISO/IEC 10646 mit seine 2^31 zulässigen Zeichen.

          Tim

  2. Hi,

    Könnte mir das freundlicherweise mal jemand mit anderen Worten erklären?

    Mit Codeeinheiten ist hier Bytes gemeint. UTF-8 Zeichen kommen also mit einer Bytelaenge von 1-4 (Umlaute kommen bspw. als zwei Byte, die meisten westeuropaeischen Zeichen als ein Byte, chinesische zeichen als vier Byte). Die Formulierung "repraesentiert Kodepositionen ..." ist m.E. backpfeifenverdaechtig.   ;-)

    Was ist ein kanonisches Kodierungsformat?

    Sorry, weiss ich auch nicht. Ist seltener Uni-Jargon.

    Gruss,
    Ludger

    1. 你好 Ludger,

      Könnte mir das freundlicherweise mal jemand mit anderen Worten erklären?

      Mit Codeeinheiten ist hier Bytes gemeint.

      Das ist falsch. UTF-16 besteht aus ein bis zwei 16 Bit (2 Byte) langen
      Kodeeinheiten. Ich hoffe, jetzt ist klar, was eine Kodeeinheit ist.

      再见,
       CK

      --
      Microsoft: Where do you want to go today?
      Linux: Where do you want to go tomorrow?
      FreeBSD: Are you guys coming, or what?
      http://wwwtech.de/
      1. Hi,

        was ist eine Kodeposition?

        Gruss,
        Ludger

        1. Hallo Ludger,

          was ist eine Kodeposition?

          Wahrscheinlich eine Eindeutschung des im Unicodesprachgebrauch benutzten englischen »code points«, der die Position des Zeichens in den Charts anzeigt. Also nichts anderes als Nummern.

          Tim

          1. was ist eine Kodeposition?

            Die Kodeposition in der Kodetabelle.

          2. Hi,

            was ist eine Kodeposition?

            Wahrscheinlich eine Eindeutschung des im Unicodesprachgebrauch benutzten englischen »code points«, der die Position des Zeichens in den Charts anzeigt. Also nichts anderes als Nummern.

            urspruenglich las sich das mal so:
            "UTF-8 hat eine Kodeeinheit von 8 Bits Länge und repräsentiert Kodepositionen mit einer bis vier Kodeeinheiten."

            Da wuerde ich Kodeposition so verstehen, dass das eine Position (ich assoziiere tatsaechlich Rechnungsposition :-) fuer ein bis vier Byte (Kodeeinheiten) ist

            Gruss,
            Ludger

            1. 你好 Ludger,

              urspruenglich las sich das mal so:
              "UTF-8 hat eine Kodeeinheit von 8 Bits Länge und repräsentiert
              Kodepositionen mit einer bis vier Kodeeinheiten."

              Da wuerde ich Kodeposition so verstehen, dass das eine Position (ich
              assoziiere tatsaechlich Rechnungsposition :-) fuer ein bis vier Byte
              (Kodeeinheiten) ist

              Das bei UTF-8 eine Kodeeinheit zufaellig genau ein Byte lang ist, heisst
              nicht, dass das bei anderen Kodierungsformaten genau so ist.

              再见,
               CK

              --
              Wenn du gehst, gehe. Wenn du sitzt, sitze. Und vor allem: schwanke nicht!
              http://wwwtech.de/
  3. hi,

    Könnte mir das freundlicherweise mal jemand mit anderen Worten erklären?

    hilft http://de.wikipedia.org/wiki/Unicode weiter?

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
  4. Hallo Krebs,

    Ich versuch das auch mal in die gängigen Unicode-Terme zu erklären:

    Prinzipiell kann eine Kodierung mehrere Kodierungsformate definieren und das kanonische Kodierungsformat muss nicht darunter sein.

    Eine Kodierung (Unicode) kann mehrere Formate (UTF-8, UTF-16, UTF-32, diese UCS-Dinger) definieren, in denen die kodierten Zeichen tatsächlich gespeichert/übertragen werden. Ein kanonisches Kodierungsformat ist - wie Christian schon erwähnt hat - ein Format, das jedes Zeichen in einer Kodeeinheit speichert. Vorsicht: eine Kodeeinheit ist hier nicht zwangsläufig gleich einem Byte.

    Ein Beispiel für ein kanonisches Kodierungsformat wäre ASCII oder ISO 8859-x: Jedes Zeichen wird ein einer Kodeeinheit kodiert: 7 Bit (bzw. 8 Bit = 1 Byte)
    Für Unicode wäre ein kanonisches Kodierungsformat UTF-32, das für _jedes_ Zeichen 32 Bit benutzt. Für die meisten Zeichen wären das dann eine Menge von Nullen vorne dran, also eigentlich: Platzverschwendung. Deswegen gibt es auch andere Kodierungsformate:

    Unicode 3.0 beispielsweise definiert nur zwei Kodierungsformate, nämlich UTF-8 und UTF-16 wobei UTF für Unicode Tranfer Format steht.

    Und zwar UTF-8 und UTF-16:

    UTF-8 hat eine Kodeeinheit von 8 Bits Länge und repräsentiert Kodepositionen mit einer bis vier Kodeeinheiten.

    In UTF-8 werden die Zeichen je nach ihrer Kodeposition (Code Point), also der Nummer in den Unicode Tabellen in unterschiedlich lange Bytes gespeichert. Die kleinste Einheit ist das Byte, die größte sind vier Byte (oder sechs, siehe Christian und ISO).

    Code Point          Binärdarstellung in UTF-8

    000000 - 00007F     0xxxxxxx
    000080 - 0007FF     110xxxxx 10xxxxxx
    000800 - 00FFFF     1110xxxx 10xxxxxx 10xxxxxx
    010000 - 10FFFF     11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    (Es ginge auch noch weiter, aber Unicode macht bei 10FFFF Schluß, im Gegensatz zu dem ISO-Standard.)

    UTF-16 hat eine Kodeeinheit von 16 Bits Länge und repräsentiert Kodepositionen mit einer bis zwei Kodeeinheiten.

    UTF-16 benutzt als kleinste Einheit zur Speicherung 16 Bit, eine Kodeeinheit beträgt also 16 Bit oder zwei Byte. UTF-16 benutzt aber für Werte jenseits von FFFF zwei Kodeeinheiten, also zweimal zwei Bytes:

    Code Point         Binärdarstellung in UTF-16

    000000 - 00FFFF    xxxxxxxx xxxxxxxx
    010000 - 10FFFF    110110xx xxxxxxxx 110111xx xxxxxxxx

    Voilá. Noch Fragen?

    Tim