1
Hallo,
heute musste ich eine Lösung finden, um russischen und chinesischen Text in die MySQL-Datenbank (MySQL 5, utf8_unicode_ci) einzufügen und richtig auf der Seite darzustellen.
Falls ihr auch mal soetwas machen müsst, beachtet folgendes:
1) Die Kollation der Datenbank selbst sollte utf-8 sein. Das kann man ändern, indem man in PHPMyAdmin von der Tabellenübersicht (=Klick auf den Datenbanknamen) auf 'Operationen' geht und dort bei 'Kollation' auf utf8_unicode_ci stellt. Wenn schon Tabellen vorhanden sind, kann es sein, dass angelegte Text/Varchar-Felder noch eine andere Kollation haben (MySQL 5) - in diesem Fall muss diese für die betroffenen Felder und Tabellen einzeln umgestellt werden ("Operationen" aus der Tabellenstruktur heraus um die Standard-Kollation für die Tabelle einzustellen und die Felder einzeln ändern)
2) Alle Texte werden mit einer normalen Query unter Verwendung von mysql_real_escape_string in die utf-8 Datenbank eingefügt, um injections zu verhindern. Der Text darf vorher nicht mit htmlentities kodiert werden.
3) Das Charset der Seite muss auf utf-8 gestellt werden.
4) Es ist keine schlechte Idee, den ISO-Code der Sprache auch mit anzugeben, also gebt diesen ebenfalls in eine Variable und hinterlegt den Wert dafür in der Tabelle der Sprachen und gebt ihn am Anfang aus (hier wurde XHTML Strict verwendet)
5) Nach der Selektion der Daten aus der Datenbank dürft Ihr für Sprachen wie chinesisch und russisch kein htmlentities anwenden. Verzichtet einfach für alle Sprachen ganz auf htmlentities und beschränkt euch auf htmlspecialchars.
6) Auch utf8_decode darf für Chinesisch und Russisch nach der Selektion des Textes aus der Datenbank nicht verwendet werden. Der Browser erwartet sich nun utf8, dementsprechend kann jede Ausgabe direkt utf8-kodiert erfolgen.
Um Chinesisch unter Windows zu testen, muss die chinesische Sprachunterstützung installiert sein, am einfachsten ist dies zu bewerkstelligen, indem man (ausnahmsweise) mit dem IE z.B. auf Google China surft und die vorgeschlagene Sprachpaket-Installation durchführt, es wird die Windows-CD benötigt.
Hoffe damit jemandem Ärger zu ersparen :)
Edit 17.08.2007: Anleitung korrigiert und ergänzt.
heute musste ich eine Lösung finden, um russischen und chinesischen Text in die MySQL-Datenbank (MySQL 5, utf8_unicode_ci) einzufügen und richtig auf der Seite darzustellen.
Falls ihr auch mal soetwas machen müsst, beachtet folgendes:
1) Die Kollation der Datenbank selbst sollte utf-8 sein. Das kann man ändern, indem man in PHPMyAdmin von der Tabellenübersicht (=Klick auf den Datenbanknamen) auf 'Operationen' geht und dort bei 'Kollation' auf utf8_unicode_ci stellt. Wenn schon Tabellen vorhanden sind, kann es sein, dass angelegte Text/Varchar-Felder noch eine andere Kollation haben (MySQL 5) - in diesem Fall muss diese für die betroffenen Felder und Tabellen einzeln umgestellt werden ("Operationen" aus der Tabellenstruktur heraus um die Standard-Kollation für die Tabelle einzustellen und die Felder einzeln ändern)
2) Alle Texte werden mit einer normalen Query unter Verwendung von mysql_real_escape_string in die utf-8 Datenbank eingefügt, um injections zu verhindern. Der Text darf vorher nicht mit htmlentities kodiert werden.
3) Das Charset der Seite muss auf utf-8 gestellt werden.
<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
oder für IE<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Eventuell ist es notwendig, zusätzlich per PHP einen header auszugeben (vor allen anderen Ausgaben)header("Content-Type: text/html; charset=UTF-8");
Die Datenbankverbindung muss auf utf8 gestellt werden (erste Query nach der Verbindung zur Datenbank, pro Verbindung einmal auszuführen)mysql_query("SET names 'utf8'")
N.B. Dies ist evtl. nicht notwending, wenn in der PHPMyAdmin-Datenbankübersicht bei 'Kollation der MySQL-Verbindung' bereits 'utf8_unicode_ci' festgelegt ist. Falls nicht oder es sich nicht ändern lässt, muss mittels diesen Befehls die Kollation vor allen anderen Queries festgelegt werden. Die Ausführung schadet jedenfalls auch nicht - um die Portabilität des Codes zu garantieren, ist es unbedingt empfehlenswert, den Befehl auszuführen. Weitere Infos dazu gibt es in der MySQL-Dokumentation4) Es ist keine schlechte Idee, den ISO-Code der Sprache auch mit anzugeben, also gebt diesen ebenfalls in eine Variable und hinterlegt den Wert dafür in der Tabelle der Sprachen und gebt ihn am Anfang aus (hier wurde XHTML Strict verwendet)
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
5) Nach der Selektion der Daten aus der Datenbank dürft Ihr für Sprachen wie chinesisch und russisch kein htmlentities anwenden. Verzichtet einfach für alle Sprachen ganz auf htmlentities und beschränkt euch auf htmlspecialchars.
6) Auch utf8_decode darf für Chinesisch und Russisch nach der Selektion des Textes aus der Datenbank nicht verwendet werden. Der Browser erwartet sich nun utf8, dementsprechend kann jede Ausgabe direkt utf8-kodiert erfolgen.
Um Chinesisch unter Windows zu testen, muss die chinesische Sprachunterstützung installiert sein, am einfachsten ist dies zu bewerkstelligen, indem man (ausnahmsweise) mit dem IE z.B. auf Google China surft und die vorgeschlagene Sprachpaket-Installation durchführt, es wird die Windows-CD benötigt.
Zusammenfassung:
Einfügen in die utf-8 Datenbank + anschließende Darstellung des Textes für alle Sprachen (als Beispiel eine Tabelle 'textblocks' mit id (int autoincrement) und block (text, utf8_unicode_ci) aus einer POST-Textarea mit name="textfeld"). Darstellung mit Charset = utf-8
Vorher ausführen:
Einfügen:mysql_query("SET names 'utf8'");
Selektieren:mysql_query("INSERT INTO textblocks VALUES ('".mysql_real_escape_string($_POST['textfeld'])."')");
Darstellen:$text = mysql_result(mysql_query("SELECT block FROM textblocks WHERE id=1"), 0, 0);
echo htmlspecialchars(stripslashes($text));
Hoffe damit jemandem Ärger zu ersparen :)
Edit 17.08.2007: Anleitung korrigiert und ergänzt.