Wann wird wo encodet?
am 04.12.2006 20:24:06 von officialHallo Gemeinde,
Ich hab so leichte Verständnisprobleme, wann wo was encoded wird.
Ich betreibe die Seite www.ufra-schach-jugend.de. Unter Turniere muss ich
regelmäÃig Turniertabellen veröffentlichen. Die werden mit einem
Windows-Programm erstellt und als latin1-Text exportiert, danach mit recode
nach utf-8 gewandelt. So weit, so gut.
Lokal bleibt alles bei utf-8. Das funktioniert wunderbar. Die Textdatei wird
per Browser in ein PHP-Skript eingelesen, das die Tabelle parst. Dann legt
das Skript eine MySQL-Tabelle an und schreibt die Daten hinein. Andere
Skripte lesen die MySQL-Tabellen wieder aus und geben schön (glaub ich
zumindest) formatierte Tabellen aus.
Eine Kontrolle zeigt:
mysql> select name, hex(name) from a where nr=4;
+--------------+--------------------------+
| name | hex(name) |
+--------------+--------------------------+
| Müller, Max | 4DC3BC6C6C65722C204D6178 |
+--------------+--------------------------+
1 row in set (0.00 sec)
C3BC für ü sieht ganz vernünftig aus. Die Konsole ist auf utf-8
gestellt und zeigt den Umlaut ebenfalls korrekt an. Ebenso sind die Umlaute
in den Ausgabescripten korrekt dargestellt.
Jetzt das gleiche in der "Produktion". Hier ist die locale latin1. alles
andere ist utf-8: die mysql-Tabellen und Datenbanken, apache serviert auch
als utf-8. Die Skripten werden unverändert hochgeladen. Die gleiche
Textdatei wird von hier aus per Browser in das PHP-Script auf dem Server
eingelesen, das schreibt sie in die MySQL-Tabelle. Die anderen Skripte
lesen die Tabellen wieder aus, und die Umlaute werden korrekt angezeigt.
Aber:
mysql> select name, hex(name) from a where nr=4;
+--------------+------------------------------+
| name | hex(name) |
+--------------+------------------------------+
| Müller, Max | 4DC383C2BC6C6C65722C204D6178 |
+--------------+------------------------------+
1 row in set (0.00 sec)
Das ü ist jetzt C383C2BC, der Umlaut wird auf der latin1-Konsole falsch
dargestellt, auf der utf-8-Konsole aber richtig.
Ich habe irgendwie den Eindruck, dass die utf-8-Textdatei als latin1
aufgefasst und nach utf8 gewandelt wird und dass das beim Ausgeben wieder
rückgängig gemacht wird. Das führt dazu, dass der mysqldump nicht portabel
ist (wofür mysqldump nix kann). Und da ich demnächst wohl den Server
wechlse, ist das recht ärgerlich.
Ein- und Ausgabeskripte verwenden PEAR::HTML_Template_Sigma.
Wie schaffe ich es, dass in der Tabelle die echten utf8-Codes stehen und
auch richtig interpretiert werden?
Ich vermute mal, dass der Fehler im Zusammenspiel von MySQL und PHP
entsteht, bin mir aber nicht sicher, daher Xpost & F'up.
mfg
Christian
--
When I die, I want to die like my Grandmother who died peacefully
in her sleep. Not screaming like all the passengers in her car.