Unser Verzeichnis wird naturgemäß von vielen Webmastern regelmäßig besucht. Viele haben deutsche Webseiten und damit verbunden die Frage, wie mit Umlauten im Text richtig umgegangen werden sollte.

BeamMachine stammt auch aus einer Zeit, in der ISO 8859-1 üblich war. Heute steht jedoch fest, dass UTF-8 das Non plus ultra der Webentwicklung ist. Was ist nun also der Unterschied zwischen ISO und UTF, wer sollte welches Charset, welchen Zeichensatz, nutzen und wie kann man gemischte Umgebungen handhaben? Kurz: worauf kommt es an und wie funktionieren internationale Zeichensätze…

ISO, DIN, ASCII und UTF

Abkürzungen und Kauderwelsch säumen den blutigen Pfad misslungener Encodings. Dabei ist es eigentlich sehr einfach und entstammt der Praxis, das IT-Systeme vor allem in der wirtschaftlichen Hochburg der Nachkriegszeit, den USA, das Licht der Welt erblickten. Alles, was die ersten populären Computer brauchten, war das englische Alphabet von A-Z, die Zahlen und ein paar Satz- und Sonderzeichen. Dazu gab es ein paar kuriose Steuercode wie ein Zeichen namens „Bell“, das wie der Glockenton einer Schreibmaschine, auf dem Computer-Terminal einen Piepton erzeugt hat. Der Ursprung des ASCII-Codes ist also die Schreibmaschine!

ISO ist das Kürzel der Organisation, die alle ISO-Standards definiert hat. Die International Organization for Standardization kümmert sich im internationalen Rahmen um das, das die DIN – das deutsche Institut für Normung – hierzulande macht. Im Falle von Zeichensätzen wird sichergestellt, dass jedes Zeichen einen ganz bestimmten Code hat. ISO 8859-1 ist eine Erweiterung von ASCII um in der westlichen Welt übliche Umlaute und Buchstaben mit Akzenten etc.

UTF-8 steht für 8-Bit Universal Character Set Transformation Format. Das brauchen Sie meinetwegen nicht auswendig zu lernen, es sei denn, Sie benötigen es für einen Vortrag, was ja immer wieder vorkommen soll!

UTF-8 ist in 8-Bit abgebildet und damit erst einmal auf 256 Zeichen beschränkt. Die ersten 128 Bit sind deckungsgleich mit dem ASCII-Zeichensatz, die restlichen 128 Bit sind mit ISO 8859-1 deckungsgleich. Daher ist es zu den üblichsten westlichen Zeichensätzen abwärtskompatibel. Das ist praktisch, denn so lassen sich alte Texte auf ASCII oder ISO 8859-1 Basis auch heute auf UTF-8 Systemen noch verarbeiten.

UTF-8 ist aber noch viel mehr. Es ist eine Darstellung von Unicode-Zeichen, in der „langfristig für jedes sinntragende Schriftzeichen oder Textelement aller bekannten Schriftkulturen und Zeichensysteme ein digitaler Code festgelegt wird“, das kann man hier in der Wikipedia nachlesen… es bedeutet, dass UTF-8 jeden Text dieser Welt codieren kann. Wirklich: jeden Text, sofern seine Zeichen im Unicode-Standard definiert ist. Wenn man sich klar macht, dass viele Zeichen erst durch die Kombination eines Grundzeichens mit Tilde, Akzent oder Zirkumflex entstehen, wird klar, dass 256 schon in unserer westlichen Kultur nicht genügen. Soll die Zeichenkodierung dazu alle asiatischen Zeichen und historische Schriften abdecken… genau dafür wurde der Unicode-Standard entwickelt.

Zusammengefasst:

  • ASCII ist auf die wichtigsten Zeichen für US-Amerikanische Texte beschränkt.
  • ISO 8859-1 erweitert ASCII um die Sonderzeichen anderer Sprachen (Umlaute, Akzente etc.)
  • UTF-8 erweitert ISO 8859-1 (und damit auch ASCII) um alle Zeichen, die im Unicode Format definiert sind.

Besonderheit von UTF-8

UTF-8 ist eine Darstellung von Unicode. Unicode selbst gibt jedem Zeichen eine Nummer. Da es sehr viele Zeichen gibt, bräuchte man deutlich mehr als 8 Bit, um alle Unicode-Zeichen zu codieren. Unter Windows und innerhalb von Java wird Unicode als UTF-16 codiert, in denen ein Großteil der Unicode-Zeichen in 16 Bit abgebildet wird. Jedes Zeichen nimmt somit 2 Byte ein. UTF-16 ist damit nicht abwärtskompatibel. Er hat den Vorteil, dass man die Anzahl der Zeichen innerhalb eines Textes anhand der Datenmenge ermitteln kann: Buchstaben = Bytes / 2.

UTF-8 stellt den ersten Teil der Buchstaben mit jeweils nur einem Byte dar. Nur dadurch ist es abwärtskompatibel und benötigt auch für viele Texte genau so viele Bytes, wie Buchstaben. Um den ganzen Unicode-Bereich mit UTF-8 darstellen zu können, wird ein Trick verwendet. Für besondere Zeichen, werden zusätzliches Bytes angeführt, die Trail Bytes. Vielleicht kennen Sie diese Zeichen bereits – sie werden sichtbar, wenn ein UTF-8 Text versehentlich als ISO interpretiert wird. Sie stellen sich dann häufig als ein Buchstabe ähnlich eines A dar, weil ihr Byte-Muster sich mit einem Zeichen in den oberen 128 Werten des ISO 8859-1 deckt.

Webseite im UTF-8 – worauf achten?

UTF-8 hat eine zentrale Rolle im Internet. Das liegt auch daran, dass dieses Format sehr kompakt ist. Die häufigsten Zeichen sind direkt in den erster 8 Bit enthalten. Andere übliche Sonderzeichen sind in 16 Bit (2 Byte) codiert. Das spart im Vergleich zu anderen Unicode-Systemen Bandbreite, und die ist im Internet kostbar. Dank seiner zentralen Rolle ist die Verwendung recht einfach. Das größte Problem mit UTF-8 dürfte sein, wenn ein Webmaster zwischen unterschiedlichen Standards hin und her wechselt. Daher gilt:

Vermeide gemischte Codierungen – bleibe bei UTF-8.

Wie erstellt man Unicode-Dokumente?

Moderne Editoren unterstützen unterschiedliche Zeichenkodierungen, doch ein Blick in die Feature-Liste bzw. in die Anleitung lohnt sich auf jeden Fall, um sich damit vertraut zu machen. Die Schwierigkeit der HTML-Editoren liegt nicht in der Unterstützung von Unicode bzw. UTF-8, sondern darin, diese Funktion dem Anwender transparent und verständlich zu machen. Wenn ein Dokument im falschen Modus begonnen wird, stellt sich bei einer späteren Änderung die Frage, ob der Inhalt konvertiert werden muss oder nicht. Man muss also Umsichtig vorgehen, um bei der Konvertierung Fehler zu vermeiden.

Ein normales Textdokument kann in jedem „Charset“ (Zeichensatz) verfasst sein. Text- und HTML-Editoren versuchen, den Zeichensatz zu erraten, indem sie den Inhalt mit den erlaubten Zeichen der Zeichensätze vergleichen. Darin liegt die Verantwortung für den User, selbst auf den richtigen Charset zu achten. Ist der richtige Zeichensatz aber einmal bestimmt und dem Editor ausreichend bekanntgegeben, braucht beim Schreiben nicht mehr darauf geachtet zu werden.

Was beachten bei UTF-8 in HTML?

Anders als bei rohen Textdokumenten ist es bei HTML und anderen strukturierten Formaten (XML, XHTML): damit eine Website bzw. ein Autor dem Webbrowser mitteilen kann, welcher Zeichensatz zu verwenden ist, gibt es verschiedene Möglichkeiten im Rahmen der Meta-Tags und des HTTP-Protokols.

Die Angabe der „HTTP-Equivalenz“ übersteuert die Angabe des Charsets im HTTP-Header, der eigentlich vom Webserver erzeugt wird. So ist es möglich, im HTML-Dokument einen anderen Charset vorzugeben, als ihn der Webserver vorsieht. Diese Methode funktioniert bei allen XHTML 1.x Dokumenten und ist wohl die verlässlichste Art, innerhalb einer HTML-Seite ein Charset vorzugeben. Dabei muss nicht auf die HTML-Version geachtet werden, jedoch – wenn man validen Code erzeugen möchte, muss ggf. das Close-Tag mit einem Schrägstrich erfolgen, siehe HTTP-Equivalenz-Tag (XHTML) in der folgenden Aufzählung:

  • HTTP-Equivalenz-Tag (HTML4):
    <meta http-equiv=“Content-type“ content=“text/html;charset=UTF-8″>
  • HTTP-Equivalenz-Tag (XHTML):
    <meta http-equiv=“Content-type“ content=“text/html;charset=UTF-8″ />
  • Im Rahmen der XML-Deklaration:
    <?xml version=“1.0″ encoding=“UTF-8″?>
  • HTML 5 – Variante:
    <meta charset=“UTF-8″>

Randbemerkung über HTML-Entities: Der HTML-Standard kennt die HTML-Entities (bspw. „&uuml;“ für „ü“ etc.), mit denen zum Beispiel Umlaute oder ganze Unicode-Sequenzen kodiert werden können (mehr über Unicode unten in diesem Beitrag). HTML-Entities sind eher eine Krücke für HTML-Seiten im ASCII-Format, die im Quelltext recht umständlich zu handhaben und im Prinzip völlig unnötig sind, wenn man sich über die Verwendung des Zeichensatzes im Klaren ist.

Unterstützen CMS wie Typo3, Joomla, Drupal oder WordPress Unicode?

Ja! Wer ein aktuelles Content Management System einsetzt, braucht sich in der Regel um nichts zu kümmern. Die HTML-Ausgabe erfolgt in UTF-8 und alle Eingabefelder folgen dieser Vorgabe. Dadurch werden alle Eingaben von Nutzern und Admins automatisch als UTF-8 an den Server geschickt. Gefahr für zerstörte Zeichen besteht dann allenfalls an ungewöhnlichen Schnittstellen, wenn zum Beispiel Daten mit einer alten Datenbasis ausgetauscht werden oder alte Module oder Textdokumente eingebunden werden.

Zeichensätze programmatisch konvertieren mit PHP

Auch beim Import alter Daten, zum Beispiel im Rahmen eines Relaunch, besteht die Gefahr, Datensalat zu produzieren. Für PHP-Entwickler gibt es zwar eine ganze Reihe Funktionen, die den Umgang mit und das Konvertieren von Zeichenketten von einem Zeichensatz zum anderen ermöglichen. Leider wird dies jedoch bis PHP 5 nicht im PHP-Core unterstützt. Alle String-Funktionen des klassischen PHP (strlen(), substr(), str_replace() etc.) arbeiten auf 8-Bit-Basis, mitunter sogar im alten ASCII-Raum ohne Umlaute. Schon das alphabetische Sortieren kann damit zu einer kleinen Herausforderung werden, wenn es um eine deutsche Website geht.

Zum Glück gibt es die Multibyte-Extension: sie bringt Funktionen wie mb_strlen() mit sich, die den Zeichensatz berücksichtigen. Wie oben schon erklärt, musste man bei ASCII nur die Byteanzahl ermitteln und hatte damit auch die Buchstabenanzahl einer Zeichenkette. Das geht bei UTF-8 nicht, weil jeder Buchstabe von 1 bis 4 Byte lang sein kann. Um also die Länge eines Multibyte-(Unicode)-Strings mit PHP zu ermitteln, verwendet man lieber:

$length = mb_strlen( $string, 'UTF-8' );

Mit den MB-Funktionen in PHP lässt sich zwar vieles anstellen. Alle Unicode-Stringfunktionen, sind damit verfügbar. Als einziges Problem, das nicht zu lösen ist, bleibt die Konvertierung von UTF-8 nach ISO 8859, denn nicht alle Zeichen können in ISO bzw. ASCII abgebildet werden. Wer solche Probleme hat, findet vielleicht seine Lösung in der Online-Dokumentation von utf8_decode().

Autor:
Tobias Sasse
Software-Ingenieur / Freelancer