dedlfix: utf8 - unicode

Beitrag lesen

Hi!

Content-type:text/html; charset=UTF-8
ja, auch die Autoren der HTTP-Spec haben es falsch gemacht; das ist bekannt. Kein Grund den Fehler zu wiederholen.
Und die von der MIME-Specification auch...
Nein das hat nichts mit Wiederholung zu tun.

Hat es auch nicht, denn es ist ein und dasselbe. Bei http://de.selfhtml.org/xml/regeln/xmldeklaration.htm#zusatzangaben@title=XML hat man den Fehler nicht wiederholt, da heißt es encoding.

Die Verwendung von "charset" hat vor allem historisch Gründe beziehungsweise liegt in der nicht zwingend vorhandenen Notwendigkeit begründet, bei Zeichensätzen mit bis zu 256 Zeichen zwischen der Position eines Zeichens im Zeichensatz und der Kodierung dieser Position als Bytewert zu unterscheiden. Position 64 = Bytewert 64 (oder 40 in Hex) oder 1 Zeichen = 1 Byte. (Da war die Welt noch übersichtlich - und ziemlich klein. Der kalte Krieg zog seine Schützengräben und das Dahinter interessierte kaum. Außerdem war Speicher und Rechenleistung zu knapp, um unnötig Ressourcen für Schriftsysteme von anderen Provinzen dieser Welt zu reservieren.)

Schau. ich gebe das Charset an, das zum Document gehört.
Das Charset ist hier eine Analogie zur Sprache.

Der Empfänger soll einen Bytestrom interpretieren. Dazu benötigt er nicht den Zeichensatz sondern erst einmal die Kodierungsvorschrift, um aus den Bytewerten oder -sequenzen das passende Zeichen zu entnehmen. Es muss also nicht "Unicode" bekannt sein sondern "UTF-x" (x wie 8, 16, etc.).

Im Browser kannst du das Encoding (Analogie = Übersetzung) definieren. Das heisst, übersetze Bytes zu Unicode als ob die Sprache so oder so sei.

Der Browser benötigt das Wissen um die Encoding-Vorschrift, damit er das richtige Decoding anwenden kann, um letztlich das richtige Zeichen an das Ausgabemedium (z.B. Bildschirm) senden zu können. (Den Weg zurück zum Server können wir für diese Diskussion unbetrachtet lassen.)

Der Vergleich mit einer natürlichen Sprache hinkt sehr. Aber ich versuche es mal:

EDV                      - Sprache
-----------------------------------------
Zeichenkodierung (UTF-8) - Schallwellen
Zeichensatz              - Wörter
Zeichen                  - Begriff

Mit Zeichen und Begriff ist das gemeint, was man gemeinhin mit einem konkreten solchen assoziiert.
Zeichen "a" = Ein Buchstabe aus dem lateinischen Alphabet.
Begriff "Haus" = Das meist eckige Ding, das in der Landschaft rumsteht, das sich einige Lebewesen errichten, wenn nicht genug Höhlen zur Verfügung stehen (oder ihnen der Komfort einer solchen nicht zusagt).

Ein Document kann sich nicht selbst nach Unicode übersetzen. Es gibt lediglich durch das Charset seine Syntax, seine Sprache an, welche als ein Part in der Übersetzung zu wählen ist.

So richtig verstehe ich nicht, was du mir damit zu sagen versuchst.

Unicode ist nicht die Kodierung eines Dokuments sondern beschreibt nur den Vorrat aller Zeichen, die das Dokument nutzen kann, ohne konkret zu sagen, wie die Zeichen jeweils repräsentiert werden. Will man eines dieser Zeichen in einem real existierenden Medium abbilden, braucht es eine Kodiervorschrift. UTF-8 sagt, wie das Zeichen "sowieso" konkret in Bytes gegossen aussieht.

Der andere Part ist die dem programm eigene Idee von Bytes zu Unicode. Ich habe schon gesagt. Perl verwendet zwei Charsets intern.

Du meinst die Idee von Bytes (einer bestimmten Kodierung) zu einer internen Darstellung (zwecks Verarbeitung). Da Unicode nicht beschreibt, wie ein Zeichen im Speicher abzubilden ist, muss man sich hier eine eigene Kodierung erfinden oder eine der vorhandenen verwenden. UTF-8 ist zwar (sehr) gut für den Transport (von Dokumenten vorwiegend westlichen Inhalts) geeignet, aber aufrund der unterschiedlichen Bytesequenzlängen weniger gut für die interne Verarbeitung. Wenn man sich für Stringfunktionen nicht immer durch diese Sequenzen durchhangeln will, kommt man besser, wenn man gleichlange Strukturen zum Speichern der Zeichen verwendet, also 16 Bit wenn man nur die bis zu 65.536 Zeichen von Unicode 1.0 berücksichtigen will oder 21 Bit (sinnvollerweise gleich 3 oder 4 Byte) für alle 1.114.112 möglichen Zeichen ab Unicode 2.0. Mit diesen einheitlich langen Containern für die Zeichen kann man unter anderem schneller die Positionen der einzelnen Zeichen im Speicher berechnen (Position im Speicher = Position im String * Containerlänge).

Encoding und Decoding ist die Übersetzung der externen Ressource in diese interne Präsentation.

Die Begriffe Encoding und Decoding stehen ja nicht nur für das Hin- und Her zwischen Zeichensatz-Position und Bytewerten sondern auch allgemein für eine Umwandlung von einer Darstellung in eine andere und zurück.

Dass zwischen Perl-interner (vielleicht proprietärer) Repräsentation und einer genormten Form zwecks Austausch mit anderen Systemen en- und decodiert werden muss steht außer Frage. Aber das ist kein Grund zwischen Zeichensatz und Zeichenkodierung nicht richtig zu unterscheiden oder den "charset"-Fehler nicht als solchen zu bezeichnen.

Lo!