potentialartikel1-blick3qc

UTF-8 in websites - Zeichenkodierung, Zeichensatz und Kollationen

21. Januar 2008 von S. Omieczynski http://blacmox.de/artikel/UTF-8_in_websites

Für die Darstellung heterogener Schriftzeichen ist Unicode besonders geeignet; insbesondere wenn eine Zeichenkodierung nach ISO-8859 nicht in Frage kommt. Der Artikel beschreibt typische Hürden im Zusammenspiel von PHP und MySQL für dynamisch erzeugte Seiteninhalte.

pointASCII (American Standard Code for Information Interchange)

Bei der Bearbeitung eines (web-) Dokumentes wird der verfügbare Zeichensatz (Zeichenvorrat) von der Vorschrift zur Kodierung der Schriftzeichen begrenzt. In einer entsprechenden Code-Tabelle findet jedes Zeichen eine numerische Entsprechung.

So lassen sich im Fall der primitiven ASCII-Kodierung (7-Bit) 95 druckbare Zeichen darstellen; diese finden sich im Layout einer Standard-Tastatur wieder:

- 52 Buchstaben des lateinischen Alphabetes in Groß- und Kleinschreibung
- 10 arabische Ziffern
- 33 Satzzeichen, Klammern und Symbole

pointISO/IEC 8859

Für die zusätzliche Unterstützung regionaler Sonderzeichen wird i.d.R. eine Variante der ISO-8859 (8 Bit Kodierung) verwendet. Die Codepages der Normenfamilie enthalten alle Zeichen des ASCII-Codes; sie unterscheiden sich durch 96 druckbare Zeichen am Ende der Übersetzungstabelle.
Beispielsweise enthält ISO-8859-1 (Latin-1) viele Sonderzeichen westeuropäischer Sprachen, während ISO-8859-2 (Latin-2) hauptsächlich Sonderzeichen slawischer Sprachen umfasst.

Eine triviale Aufgabe wie die Anzeige deutscher (Latin-1) und polnischer (Latin-2) Sonderzeichen innerhalb einer website ist mit ISO-8859 nicht lösbar. Obgleich beide Schriftsprachen von den Buchstaben des lateinischen Alphabetes profitieren, sind sie unterschiedlichen Codepages zugeordnet und nicht simultan verwendbar.

pointUTF-8 (8-bit Unicode Transformation Format)

Das erklärte Ziel des Unicode Standards ist eine vollständige Beschreibung von sinntragenden Zeichen aller bekannten Schriftkulturen. UTF ist eine Methode (Encoding) zur Speicherung von Unicode-Zeichen. Es werden mehrere Transformationsformate unterschieden, die sich in Speichereffizienz und (De-) Kodierungsaufwand unterscheiden.

Hinreichend bekannt und weit verbreitet ist UTF-8. Die ersten 7 Bits enthalten sämtliche Zeichen des ASCII-Codes. Das 8. Bit kann ein längeres Unicode-Zeichen (Kodierung mit bis zu 4 Byte) einleiten. Diese variable Code-Länge ermöglicht eine effiziente Speicherung von Schriftsprachen mit lateinischem Alphabet bei voller Unterstützung des Unicode-Zeichensatzes; Version 5.0 von Juli 2006 enthält 99.000 Zeichen.

pointHTTP Server, Meta-Tags und Editoren

Im Kopf-Bereich <head> einer validen HTML-Datei muss ein Meta-Tag zur verwendeten Zeichenkodierung angegeben werden:

<meta http-equiv='content-type' content='text/html; charset=utf-8'>
 

Die Meta-Information wird vom Browser zur Auswahl der passenden Zeichendekodierung ausgewertet, wenn der HTTP Server selbst keine Angabe zur Zeichenkodierung im Header sendet. Fehlen die Informationen in Header und Meta-Tag, wird das Dokument i.d.R. mit der Standard-Zeichenkodierung des Browsers interpretiert.

Tatsächlich enthalten die meisten Response-Header keine Angabe zum Type Encoding; es wird die Voreinstellung des Servers verwendet. Bei einem Apache HTTP Server kann diese in der php.ini angepasst werden:

default_charset = "utf-8"

Den selben Effekt bewirkt eine Notiz in der .htaccess auf Verzeichnis-Ebene, insofern dies durch die Direktive AllowOverride FileInfo in der Konfiguration des Servers erlaubt ist:

AddDefaultCharset utf-8

Um die Zeichenkodierung im Response-Header zu fixieren, kann ein entsprechender HTTP-Header bei jedem Request des Browsers an den Server gesendet werden:

header ( 'content-type: text/html; charset=utf-8' );

Header-Informationen zur Zeichenkodierung "überschreiben" anders lautende Meta-Tags; sie werden von Clients bevorzugt ausgewertet.

Last but not least: Das (web-) Dokument muss in UTF-8 gespeichert werden. Die meisten Editoren bieten eine Möglichkeit, die Zeichenkodierung (vor-) einzustellen. Zeichen des ASCII-Codes werden bei falschen Settings dennoch "richtig" angezeigt: die Übersetzungstabellen vieler Zeichensätze sind mit der ASCII-Codepage dahingehend kompatibel.

pointEinstellung und Abfrage der MySQL-Datenbank

Der Zeichensatz und die Kollation (Sortierfolge eines Zeichensatzes zum Vergleichen von Strings) einer MySQL-DB können auf 4 Ebenen festgelegt werden: Server, Datenbank, Tabelle, und Spalte. Auf jeden Zeichensatz sind oft mehrere Kollationen anwendbar. Einige prominente Beispiele für UTF-8 sind:

utf8_binbinäre Sortierung nach Zeichenummer in der Code-Tabelle
utf8_unicode_ciSortierung nach UCA (Unicode Collation Algorithm)
utf8_general_ci 1:1 Vergleich der einzelnen Zeichen

Die Zeichenkodierung in MySQL wird durch den eingestellten Zeichensatz bedingt; es gelten ähnliche Grundsätze wie für oben genannte Editoren. Die Kollation ist übrigens für eine korrekte Speicherung der Zeichen bedeutungslos.

Die Verbindung zwischen Client und SQL-Server beschreiben Systemvariablen. Unabhängig von Datenspeicherung und -kollation können unterschiedliche Zeichenkodierungen gelten:

1. Versenden von SQL-Anweisungen des Clients an den Server: character_set_client
2. Verbinden / Abfragen der Datenbank: character_set_connection und: character_set_collation
3. Ausgabe der Abfrageergebnisse: character_set_results

Die Variablen können im Spezialfall angepasst werden; im Allgemeinen wird die passende Einstellungen durch eine kurze Anweisung erfasst:

mysql_query( "SET NAMES 'utf8'" );

Dabei wird für die Kollation der entsprechende Standardwert (hier: utf8_general_ci) gewählt. Eine vergleichbare Anweisung setzt Zeichensatz und Sortierfolge auf die Settings der Datenbank:

mysql_query( "SET CHARACTER SET 'utf8'" );

pointZusammenfassung

Die Anzeige von Unicode-Zeichen in websites erscheint unproblematisch, wenn alle Komponenten ineinander greifen und eine Durchmischung unterschiedlicher Zeichenkodierungen bzw. Zeichensätze vermieden wird:

1. Abspeichern der Quelltexte im Editor
2. Standard-Encoding des Apache / Infos zum charset im HTTP-Header
3. Konfiguration der MySQL-DB und der Verbindung

pointLiteraturhinweise

SELFHTML: Zeichenvorrat, Sonderzeichen und HTML-eigene Zeichen link http://de.selfhtml.org/html/allgemein/zeichen.htm
Unicode - internationaler Standard für Zeichensätze link http://www.unicode.org
Dokumentation zum Apache HTTP Server link http://httpd.apache.org/docs/
MySQL Referenzhandbuch link http://dev.mysql.com/doc/