PDA

Vollständige Version anzeigen : utf-8 charset-Problem mit PHP und Mysql



kamal
04.12.08, 10:54
Hallo
folgende Situation tritt auf bei der Übergabe von Strings mit Umlauten zwischen Html-Formularen
und Mysql per PHP. Der FF steht auf utf-8, die geladene Seite hat im Html-Head auch utf-8 stehen.
Wenn nun Umlaute in ein Html-Formular eingegeben werden, werden sie mit PHP wie folgt in die DB
geschrieben:


$field1=$_POST['field1'];
$queryinsertstr=sprintf("insert into tablex (...) values (...)",$field1, $field2);
$result=@mysql_query($queryinsertstr);

Ruft man umgekehrt die Daten zur Darstellung mit PHP wieder ab, werden die Umlaute korrekt dargestellt.
Soweit sieht alles gut aus.

Jetzt zum Problem. Geht man über Confixx in Phpmyadmin hinein und ruft dort die Daten ab, sieht man
die üblichen 2 Sonderzeichen jeweils pro Umlaut, obwohl auch hier alles auf utf8 steht.
(Browser, Html-Head, Datenbank, Tabellen)

Gibt man Umlaute über Phpmyadmin ein, werden sie wiederum in Phpmyadmin selbst korrekt angezeigt, in
der PHP-Anwendung jedoch nicht. Ändere ich den FF auf ISO werden diese Umlaute, die über Phpmyadmin eigegeben wurden, auch in der PHP-Anwendung richtig angezeigt.

Die Frage wäre nun woran es liegen kann, dass sich meine PHP-Anwendung und Phpmyadmin unterschiedlich verhalten, obwohl alles was möglich ist auf utf8 steht?
Bin für jeden Hinweis dankbar.

Gruß Kamal

pinkgothic
16.08.09, 15:08
Ich bitte im voraus um Entschuldigung, wenn ich Dir hier was sage, was Du schon weißt. Ich versuche einfach Mal, das Problem zu lösen:

Deine Datenbank hat auch eine Kodierung. So wie Du der Webseite sagst, dass sie utf-8 ist, solltest Du es PHP und MySQL sagen.


mb_internal_encoding('UTF-8');
mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER SET utf8");

Außerdem sollte deine Datenbank vom charset her ("Collation") UTF8 sein, e.g. "utf8_bin". Sie ist momentan wahrscheinlich auf "latin1_swedish_ci" gestellt - kannst Du in phpMyAdmin einsehen. phpMyAdmin erkennt die Kodierung und lässt Dich entsprechend mit der Datenbank kommunizieren; und ein UTF-8 Umlaut ist nunmal eine ganz andere bytefolge als ein ASCII-latin Umlaut. UTF-8 kann mit einem ASCII-latin Umlaut nichts anfangen, und Du siehst ja was ASCII-latin aus einem UTF-8 Umlaut macht. :)