David Aurelio: Ausgabeprobleme bei UTF-8 in Verbindung mit MySQL

Beitrag lesen

Hallo Sebastian,

(Die Datenbank ist überall auf UTF-8 eingestellt, d. h. von globalen Variablen wie "character set client" bis in zu den Einstellungen für jede Spalte).

Das ist Overkill. Es reicht, wenn für die Datenbank eine Kodierung/ collation eingestellt ist.

Mein Editor (Zend Studio Client) speichert die Skripte, Templates, etc auch alle als UTF-8.

Das ist gut, sollte aber nicht zwingend erforderlich sein. Ich mache das auch so, habe aber schon überlegt, ob es nicht richtiger wäre, die PHP-Skripte in ISO-8859-1 zu speichern. Ja, ich weiß, ich hab Probleme...

Apache gibt UTF-8 aus, php ebenso, im Header wird UTF-8 angegeben und als meta-Tag zusätzlich auch noch einmal.

Hast Du das mal überprüft, z.B. mit der web developer extension für den Firefox? Information -> View Response Headers.

Dennoch werden die Sonderzeichen wie Umlaute aus der Datenbank nicht als UTF-8 dargestellt, stattdessen sieht man Fragezeichen, statische Strings mit Umlauten (die zum Beispiel in einem Template stehen oder per echo/print ausgegeben werden) aber schon.

Was passiert denn, wenn Du Deine Website vom Browser in anderen Kodierungen anzeigen lässt? Wann ist es richtig? (Z.B. im Firefox: Ansicht -> Zeichencodierung).

Danach habe ich die Strings zum Teste per mb_convert_encoding() obwohl sie eigentlich schon UTF-8 sein müssten nochmal zu UTF-8 konvertieren lassen und dann geht alles.

Von welcher Kodierung hast Du sie zu UTF-8 konvertieren lassen? Konkret: Mit was als dritten Parameter hast Du mb_convert_encoding() aufgerufen, bzw. setzt Du vorher eine interne Kodierung mit mb_convert_encoding()?

Weiß vielleicht jemand den Grund für dieses Verhalten?

Ich vermute, dass es an der Datenbankverbindung liegt. Welche SQL-Befehle führst Du aus, bevor du Datansätze abrufst?
Du solltest die Verbindungskodierung mit
SET NAMES='utf8';

oder alternativ mit

SET character_set_client='utf8';  
SET character_set_connection='utf8';  
SET character_set_results='utf8';

explizit festlegen.