Bestehende Webseite auf UTF-8 umstellen

UTF-8 (Abk. für 8-bit Unicode Transformation Format) ist die am weitesten verbreitete Kodierung für Unicode-Zeichen.

Dabei wird jedem Unicode-Zeichen eine speziell kodierte Bytekette von variabler Länge zugeordnet. UTF-8 unterstützt bis zu vier Byte, auf die sich wie bei allen UTF-Formaten alle 1.114.112 Unicode-Zeichen abbilden lassen.

UTF-8 hat eine zentrale Bedeutung als globale Zeichenkodierung im Internet. Die Internet Engineering Task Force verlangt von allen neuen Internetkommunikationsprotokollen, dass die Zeichenkodierung deklariert wird und dass UTF-8 eine der unterstützten Kodierungen ist. Das Internet Mail Consortium (IMC) empfiehlt, dass alle E-Mail-Programme UTF-8 darstellen und senden können. (vgl. auch BOM). 2008 wird diese Empfehlung allerdings immer noch nicht universell befolgt.


Quelle: www.wikipedia.de

In diesem Tutorial möchte ich einmal beschreiben, wie man bestehende Internetseiten auf UTF-8-Kodierung umstellen kann. Doch wozu ist das nötig?

Es gibt viele verschiedene Zeichen-Kodierungen, die unterschiedliche Normungen haben. Doch viele dieser Zeichensätze haben das Problem, dass sie nur eine bestimmte Menge an Teilmenge der auf der Welt bestehenden Zeichen darstellen können.

Die meisten (deutschen) Webseiten sind derzeit mit iso-8859-1 kodiert. Das reicht für gewöhnlich aus, wenn man deutsche Seiten schreiben will, denn dieser Zeichensatz umfasst alle Buchstaben, Zahlen und Sonderzeichen der deutschen Sprache.

Doch was macht man, wenn man nun z.B. chinesische Zeichen schreiben muss? Diese sind nicht im iso-8859-1 Zeichensatz vorhanden.

Hier kommt UTF-8 ins Spiel, denn mit UTF-8 ist es möglich, die Zeichen jeder Sprache zu schreiben.

Bestehende Seiten umwandeln

Ich habe derzeit leider noch kein Programm für Windows gefunden, dass sämtliche Textdateien einer Internsetseite mit einem Klick umkonvertiert. Hier habe ich mein Linux-System gestartet und mit einem Befehl alle PHP-Dateien von iso-8859-1 in UTF-8 umkonvertiert. Dazu musst du zuerst in das Verzeichnis wechseln, in dem die Webseite liegt

cd <Pfad zur Webseite>

und dann folgenden Befehl eingeben

find . -name '*.php' -exec recode latin1..u8 {} \;

Je nachdem, ob du noch Dateien mit anderen Datenendungen hast, musst du das .php durch .html, .xhtml usw. ersetzen. ACHTUNG: Gebe niemals Dateiendungen von Binärdateien, wie z.B. Bildern, Videos usw. an. Damit würdest du diese zerstören.

Solltest du von einem anderen Dateiformat als iso-8859-1 zu UTF-8 konvertieren wollen, musst du die Handbuchseite von recode zur Hilfe ziehen, indem du

man recode

eingibst.

Korrektes Meta-Tag setzen

Damit die Browser wissen, welche Kodierung die Internetseite verwendet, gibt es ein bestimmtes Meta-Tag. Bei iso-8859-1 lautete dies:

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

Dieses muss nun ersetz werden durch

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

und das auf jeder Seite, wo dieses Meta-Tag enthalten ist. Generell sollte dieses Tag auf jeder Seite enthalten sein, damit die Browser nicht selbst erkennen müssen, um welche Kodierung es sich handelt, da dies zu Fehldarstellungen führen kann.

MySQL-Datenbestand auf UTF-8 umstellen

Damit man sich nicht die Mühe machen muss, alle Datenbestände manuell konvertieren zu müssen, könnt ihr folgendes Script benutzen:

<?PHP
$hostname = "localhost"; // Standard
$database = "Datenbank-Name"; // ändern
$username = "Benutzername"; // ändern
$password = "Passwort"; // ändern

mysql_connect($hostname, $username, $password);
mysql_query("ALTER DATABASE $database DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");

$res = mysql_query("SHOW TABLES FROM $database");
while($row = mysql_fetch_row($res))
{
$query = "ALTER TABLE {$database}.`{$row[0]}` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
mysql_query($query);

$query = "ALTER TABLE {$database}.`{$row[0]}` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
mysql_query($query);
}
?>


MySQL-Datenbank anweisen, UTF-8 auszuliefern

Selbst wenn der Datenbestand nun in UTF-8-Kodierung vorliegt, liefert die Datenbank die Daten noch anders kodiert aus. Hier muss man der Datenbank sagen, wie sie die Daten ausliefern soll.

Dazu schickt man den Befehl

SET NAMES 'utf8';

an die Datenbank und alles klappt wunderbar. Wenn man z.B. eine PHP-Datei für den Verbindungsaufbau zur Datenbank hat, empfiehlt es sich, diesen Befehl direkt nach Aufbau der Verbindung zu senden:

<?PHP mysql_query("SET NAMES 'utf8'"); ?>


Editor mit UTF-8-Unterstützung benutzen

Alle diese Maßnahmen nützen nichts, wenn man einen Editor benutzt, der keine Unterstützung für UTF-8 hat. Wenn man nun etwas an einer Seite ändert oder neue Seiten erstellt, müssen diese auch im UTF-8-Format abgespeichert werden. Wie das im einzelnen geht, kann ich hier nicht erklären, da dies von Programm zu Programm unterschiedlich ist. Ich selber benutze die Entwicklungsumgebung Aptana