php: mysql_fetch_assoc und UTF8

codeguru

nicht mehr wegzudenken
ich hab noch ne Frage wegen Unicode mit PHP5 und Mysql

Unicode deswegen weil ich ne Internetseite in Mongolisch mache. Da sind im Alphabet 2 Zeichen drin, die sich mit einer klassischen Codepage-Einstellung für russiches Kyrillisch nicht darstellen lassen.

Nun mein Problemche:

Ich hab mit dem Dreamweaver 2004 ein Pulldownmenü gemacht, welches Gebrauch von mysql_fetch_assoc() macht.

Die Datenkbank kann Unicode, die ganzen Formulargeneratoren im Dreamweaver können sie - Inputfelder, Textfelder, Buttons - überall kann ich Unicode eingeben, aber irgendwie wollte das Pulldownmenü sich nicht mit Unicode füllen. Wenn ich im Mysql kyrillische Zeichen reinschreibe, dann sehen die auf der Webseite richtig aus, nur in dem HTML-Pulldownmenü nicht.

Nun, ich dachte mir, dann codiere den Kram doch mit htmlentities() aber das genauso nur Fragezeichen rausgeworfen.

Wenn ich in die Tabelle, wo die Pulldownmenüs herkommen, händisch mit htmlentities fülle, dann kommen die richtigen Zeichen im Pulldownmenü an aber das ist eigentlich etwas irre bei einem Datenbanksystem das in Varchars UTF8 speichern kann. Da mach ich aus einem 2-Byte Zeichen 14 bytes.

Kann das mysql_fetch_assoc() etwa kein UTF8 oder Arrays im Allgemeinen nicht?

Das mysql_fetch_assoc schreibt ein Schlüssel-Wert Paar aus einer SQL-Query in ein Array und die Schlüsselnamen sind rein ASCII, die Werte hingegen eben nicht.

ich muß mich etwas korrigierten - die Werte der Editfelder werden per Post oder get von meinen Forms verschickt, dort sind die Unicodes natürlich htmlentities, weil außerhalb des ASCII Zeichenvorrates, und kommen als solche in die Datenbank rein.

Die Seite an sich kommt am Browser als charset=iso 8859-1 an und mir ist das bisher nur noch nicht aufgefallen.

Nur PHPmyAdmin tut das nicht, der schreibt was anderes in die Datenbank, wahrscheinlich UTF8 codierte Zeichen.

Das hätte den Vorteil, daß man im Klartext lesen kann was die Leute da eingetippt haben und auch weniger Speicher für ein Zeichen verbraucht wird.

Aller guten Dinge sind 2:

1.) spricht der mysql Treiber kein UTF8 wenn man es ihm nicht explizit sagt. Das geht hiermit:

mysql_query("SET NAMES 'utf8'", $connection);
vor dem eigentlichen mysql_select bzw. Inserts oder Updates.
Schön wenn man dafür ne zentrale Stelle hat, der Dreamweaver legt ja eine connection-Datei irgendwo ab.

2.) muß dem Browser die richtige Zeichencodierung mitgegeben werden, und da war iso-8859-1 falsch.

Das verbirgrt sich in dieser Zeile:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

und sollte so aussehen:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 
Zuletzt bearbeitet von einem Moderator:
Oben