Linux
Webdesign
Unicode – Apache, PHP, HTML und MySQL für Unicode
Aktualisiert: 26.10.2010
Nach der Installation des Apache-Servers (inklusive PHP-Komponenten), der Spache PHP (inklusive MySQL-Komponenten) und des Datenbankservers MySQL muss in die jeweiligen Konfigurationen kurz eingegriffen werden. Zu beachten ist hier lediglich, dass die Schreibweise von UTF-8 sowohl bei PHP (utf-8) als auch bei MySQL (utf8) von der Norm abweicht; einzig HTML verwendet die korrekte Schreibweise UTF-8. Damit nun alle drei Komponenten auch wirklich UTF-8 zur internen und externen Kommunikation benutzen, müssen folgende Änderungen vorgenommen werden:
Apache-Konfiguration
Die Konfiguration des Apache-Servers gestaltet sich sehr einfach, denn es ist nur eine einzige Zeile in der Konfigurationsdatei /etc/apache2/conf.d/charset zu aktivieren.
AddDefaultCharset utf-8
PHP-Konfiguration
Der Abschnitt «mbstring» in der Konfigurationsdatei /etc/php5/apache2/php.ini legt fest, welche Kodierung bei der Umwandlung von Daten benutzt wird, welche der PHP-Engine aus einer Internetseite heraus (z. B. von Eingabefeldern) übergeben werden. Um ganz sicher zu sein, dass diese in UTF-8 umgewandelt werden, müssen hier die vier «mbstring»-Einträge explizit zu «utf-8» geändert werden.
[PHP] default_charset = "utf-8" [mbstring] mbstring.language = utf-8 mbstring.internal_encoding = utf-8 mbstring.http_input = utf-8 mbstring.http_output = utf-8
HTML-Konfiguration
Um sicher zu sein, dass die HTML-Seite auch wirklich mit der Zeichenkodierung UTF-8 gespeichert wird, müssen im jeweiligen Editor die Voreinstellungen überprüft und gegebenenfalls angepasst werden. Ist dies nicht möglich, dann sollte zumindest beim Speichern der Seite eine Option zur Zeichenkoderung vorhanden sein. Wichtig ist, in der Kopfdatei der HTML-Seite die UTF-8-Zeichenkodierung als Metadata einzutragen.
‹meta http-equiv="content-type" content="text/html; charset=utf-8"›
Bei Formularen, deren Daten meist mittels PHP irgendwohin weitergeleitet werden, muss nochmals genau definiert werden, dass der Inhalt der einzelnen Felder in der Zeichenkodierung UTF-8 vorliegt und als solcher auch von PHP aufgenommen und weitergereicht werden soll. Dies geschieht mit Hilfe des Zusatzes accept-charset innerhalb des ‹form›-Tags.
‹form action="insert.php" method="POST" accept-charset="utf-8"›
MySQL-Konfiguration
Um sicher zu gehen, dass auch MySQL vollumfänglich UTF-8 spricht, müssen gleich mehrere Bereiche (Server, Client, Import, Export) in der Konfigurationsdatei /etc/mysql/my.cnf konfiguriert werden. Bei jedem dieser Bereiche könnte man noch den Pfad zum Zeichensatz (character-sets-dir = /usr/share/mysql/charsets) hinzufügen, was aber eigentlich nicht nötig ist.
[client] default-character-set = utf8 [mysqld] default-character-set = utf8 character-set-server = utf8 collation-server= utf8_general_ci init_connect = 'SET collation_connection = utf8_general_ci' init_connect = 'SET NAMES utf8' [mysqldump] default-character-set = utf8 [mysqlimport] default-character-set = utf8 [mysql] default-character-set = utf8
Bei der Erstellung einer Datenbank in MySQL ist es wichtig, dass dem Datenbanksystem nochmals explizit mitgeteilt wird, dass die jetzt angelegte Datenbank die Zeichenkodierung UTF-8 verwenden muss, das Gleiche sollte man auch noch beim Anlegen der einzelnen Tabellen tun. Hier noch die beiden benötigten Befehle:
CREATE DATABASE xxx (...) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; CREATE TABLE yyy (...) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Wollen Sie Unicode als Zeichensatz für MySQL verwenden, dann sollten Sie Texttabellen mit VARCHAR und nicht mit CHAR definieren. Mit der CHAR-Definition ist MySQL gezwungen, immer drei Bytes für jedes Zeichen zu reservieren und die maximal mögliche Länge zu füllen. Will heissen, dass mit der Angabe CHAR(10) volle 30 Bytes Platz verloren gehen, auch wenn nichts in diesem Feld steht. VARCHAR sollte sowieso immer für jene Felder verwendet werden, in denen nicht Massentext gespeichert wird, da auch andere MySQL-Befehle eine mit VARCHAR definierte Spalte voraussetzen – so kann z. B. die für «INSERT ... ON DUPLICATE KEY UPDATE» benötigte UNIQUE-Definition nur auf VARCHAR-Spalten angewendet werden.
Kommunikation zwischen PHP und MySQL
Bei der Kontaktaufnahme von PHP mit dem MySQL-Server sollte ebenfalls nochmal explizit gesagt werden, dass die Daten in der Zeichenkodierung UTF-8 vorliegen und so auch in die Datebank eingetragen werden sollen. Die folgenden Angaben sollten daher direkt nach der Verbindungsaufnahme mit dem MySQL-Server stehen:
@mysql_connect ("localhost", "BENUTZERNAME", "PASSWORT") or die ("Crap!");
@mysql_query ("SET NAMES 'utf8'");
@mysql_query ("SET CHARACTER SET utf8");
@mysql_select_db ("DATENBANK") or die ("AH, CRAP!");
Benutzen Sie die Erweiterung mysqli, dann ist nur ein einziger Eintrag nötig:
@mysqli_connect ("localhost", "BENUTZERNAME", "PASSWORT") or die ("Crap!");
@mysqli_set_charset (’utf8’);
@mysqli_select_db ("DATENBANK") or die ("AH, CRAP!");

