dciwam.de / faq / html / zeichensatz-und-kodierung

Unterschiede zwischen Zeichensatz und Kodierung

Ich habe die Beiträge gelesen, aber ich muss eingestehen, dass ich die Unterschiede zwischen Zeichensatz und Kodierung immer noch nicht verstanden habe.

Ein Zeichensatz ist eine fest definierte Menge von Zeichen. Ein Beispiel für einen Zeichensatz soll ISO-8859-1 sein, auch genannt Latin-1, Lateinisch-1 oder im IE "Westeuropäisch (ISO)", dieser wird typischer Weise für westliche Skripte wie Deutsch verwendet, so auch in diesem Posting:

    ------------------------------------
    |  !"#$%&'()*+,-./0123456789:;<=>? |
    | @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ |
    | `abcdefghijklmnopqrstuvwxyz{|}~  |
    | ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿   |
    | ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß |
    | àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ |
    ------------------------------------

Eine Zeichenkodierung ist ein System, das die Darstellung aller Zeichen eines Zeichensatzes ergmöglicht. Dies geschieht in der Regel dadurch, dass man Bytes Zeichen zuordnet, in unserem Beispiel sieht das so aus:

    dezimal  hex  Zeichen
    ---------------------
        32 | 20 |  
        33 | 21 | !
        34 | 22 | "
        35 | 23 | #
        ............
       252 | FC | ü
       253 | FD | ý
       254 | FE | þ
       255 | FF | ÿ

Wie sieht das praktisch aus? In diesem Posting steht ja zum Beispiel mein Name. Der wird natürlich in Bytes gespeichert, dafür nehme ich mal einen passenden Auszug aus der Tabelle:

        66 | 42 | B
       106 | 6A | j
       246 | F6 | ö
       114 | 72 | r
       110 | 6E | n

Mein Name steht in diesem Posting also als hexadezimal 42 6A F6 72 6E. Der Newsreader kennt diese Zuordnungstabelle und stellt die Zeichen entsprechend dar, allerdings nur wenn er weiß, daß ich ISO-8859-1 benutze. Um das zu gewährleisten gebe ich das im Header an, dort steht

Content-Type: text/plain; charset=ISO-8859-1

Das gleiche gilt natürlich auch für einen Browser, daher muss man im HTTP Header die Kodierung angeben. Wenn das nicht möglich ist, eben mit

<?xml version='1.0' encoding='ISO-8859-1'?>

bzw. oder für den Moment besser zusätzlich bei XHTML 1.0

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

Ansonsten weiß der Browser nicht, was man für ein Zeichen meint, wenn er auf z.B. 0xF6 (s.o) trifft. Man muss ja nicht ISO-8859-1 verwendet haben, es kann auch z.B. CP850 sein (findet sich unter MS-DOS bzw. der Windows Eingabeaufforderung) dort entspricht 0xF6 nicht 'ö' sondern dem Divisionszeichen '÷'.

[*]

ISO-8859-1 ist also beides, eine Zeichenkodierung und ein Zeichensatz, also eine Anzahl von Zeichen und ein System diese Zeichen darzustellen.

Bei HTML gehen die beiden Begriffe auseinander. Der Dokument-Zeichensatz eines HTML Dokumentes ist immmer ISO 10646 oder Unicode. Unicode ist ein Zeichensatz, der alle Zeichen der großen (und ziemlich vieler kleinerer) Schriftkulturen der Welt umfasst. Jedes Unicode-Zeichen läßt sich in jedem HTML Dokument verwenden und zwar durch die &#nnnnn; Notation. Für häufig verwendete Zeichen gibt es auch benannte Entities wie ö oder € Durch die Angabe 'charset' oder 'encoding' wie oben legt man also nicht mehr einen Zeichensatz für das Dokument fest, sondern nur eine Kodierung, der Zeichensatz des Dokumentes bleibt immer ISO 10646 bzw. Unicode. Auch wenn ich ISO-8859-1 als Zeichensatz angegeben habe kann ich noch andere Zeichen darstellen. In diesem Posting kann ich kein Omega schreiben, ISO-8859-1 kennt kein solches Zeichen, in HTML schreibe ich einfach ω

[*] Das gilt allerdings nur für HTML Dokumente, nicht mehr für XHTML. Da XHTML alle Regeln von XML erbt, gibt es eine Default-Kodierung nämlich UTF-8. Gibt man nichts anderes an, wird UTF-8 angenommen. UTF-8 ist eine Zeichenkodierung für dein Unicode-Zeichensatz.

Björn Höhrmann • bjoern@hoehrmann.de . http://www.bjoernsworld.de

Zum Seitenanfang

URL: http://dciwam.de | Letzte Änderung: 20.05.2009 | G. Schneider | Kontakt