PHP, MySQL und UTF-8
David
- php
0 Sven Rautenberg0 David
Hallo allerseits,
ich habe ein Problem mit in UTF-8 codierten Daten, welcher ich an eine MySQL-Datenbank schicke, wieder heraushole und ausgeben möchte.
Es klappt auch fast alles, außer, dass nur Fragezeichen ausgegeben werden.
Habe schon das Archiv durchsucht und gegoogelt, aber noch keine Lösung gefunden.
Erstmal mein Setup:
Apache 2.0.53
PHP 4.3.10
MySQL 4.1.11
Ich habe eine Datenbank mit utf8 als charset angelegt:
CREATE DATABASE
test DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Die Tabelle habe ich folgendermaßen angelegt:
CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`text` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
);
Befüllt habe ich sie folgendermaßen durch ein PHP-Script, den String lese ich eigentlich aus einer Textdatei, welche utf-8-codiert ist:
mysql_unbuffered_query ("INSERT INTO `test` (text) VALUES (_utf8 'ጲᏏऒ | ئةجذزص | ЭЊСβ ==> 嶐')");
mysql_unbuffered_query ("INSERT INTO `test` (text) VALUES ('ጲᏏऒ | ئةجذزص | ЭЊСβ ==> 嶐')");
Ob ich vorher "SET NAMES='utf8'"
als query an die Datenbank schicke, hat keine Auswirkung.
Wenn ich die beiden entstandenen Zeilen in phpMyAdmin betrachte, wird die erste korrekt angezeigt, während die zweite nur Müll ist:
ጲᏏऒ | ئةجذزص | ЭЊСβ ==> 嶐
ጲá??ऒ | ئةجذزص | ÐЊСβ ==> å¶?å
Wenn ich das ganze per
$query = mysql_query ("SELECT
textFROM
test");
wieder auslese, wird die erste Zeile als Kette von Fragezeichen ausgegeben ("??? | ?????? | ???? ==> ?"), also die, die in phpMyAdmin korrekt dargestellt wird.
Die zweite Zeile, welche in PMA als Datenmüll angezeigt wird, wird bis auf wenige Zeichen korrekt ausgegeben:
ጲ�??ऒ | ئةجذزص | ЭЊСβ ==> �?
Auch bei der Abfrage ändert ein "SET NAMES='utf8'"
vorher nichts...
Woran kann das liegen. Ich habe schon versucht, im Sourcecode von phpMyAdmin zu suchen, wie es da gemacht wird, aber der ist nicht wirklich übersichtlich...
Vielen Dank schon mal,
David
Moin!
ich habe ein Problem mit in UTF-8 codierten Daten, welcher ich an eine MySQL-Datenbank schicke, wieder heraushole und ausgeben möchte.
Es klappt auch fast alles, außer, dass nur Fragezeichen ausgegeben werden.
Werde dir bewußt, welche Komponenten alles am Zeichensatz rumspielen und das Ergebnis verfälschen können - da gibts nämlich ganz schön viele:
1. Dein Texteditor für die PHP-Skripte. Kann der UTF-8? Speichert der das auch ordentlich ab?
2. Deine Datenbank-Befüllungs-Datei. Ist die auch wirklich in UTF-8 geschrieben?
3. Die Datenbank selbst, obwohl ich aus Erfahrung vermuten würde, dass die eigentlich am allerwenigsten Probleme macht.
4. Ganz wichtig: Die PHP-Skripte selbst, die den Krempel wieder ausgeben, müssen zwingend nicht nur die Bytes von der DB zum Browser schaufeln, sondern natürlich auch dafür sorgen, dass der Browser die richtige Zeichencodierung (idealerweise eben UTF-8) benutzt.
5. Und der Browser selbst muß UTF-8 dann natürlich nicht nur kriegen, sondern auch verarbeiten können.
Alle diese Voraussetzungen müssen stimmen, damit deine arabischen und chinesischen und kyrillischen Zeichen überhaupt angezeigt werden können. Und selbst dann sind insbesondere für Chinesisch meist noch spezielle Font-Dateien erforderlich, weil diese Zeichen in den meisten normalerweise benutzten Fonts nicht enthalten sind (sonst siehst du allerdings keine Fragezeichen, sondern Quadrate).
- Sven Rautenberg
Hallo Sven,
Danke für Deine Anmerkungen, allerdings ist jede davon erfüllt.
- Dein Texteditor für die PHP-Skripte. Kann der UTF-8? Speichert der das auch ordentlich ab?
Mein Editor (Quanta) kann utf-8. Ob er es ordentlich macht, weiß ich nicht, allerdings scheint das Problem an dieser Stelle nicht zu liegen, da ich die Zeichen ja anscheinen 'ordentlich' in die Db hinein bekomme.
- Deine Datenbank-Befüllungs-Datei. Ist die auch wirklich in UTF-8 geschrieben?
Ja.
- Die Datenbank selbst, obwohl ich aus Erfahrung vermuten würde, dass die eigentlich am allerwenigsten Probleme macht.
Mit der 4.1er mache ich gerade die ersten Erfahrungen. Ich hoffe, dass ich beim Anlegen von Db und Tabelle nichts falsch gemacht habe.
- Ganz wichtig: Die PHP-Skripte selbst, die den Krempel wieder ausgeben, müssen zwingend nicht nur die Bytes von der DB zum Browser schaufeln, sondern natürlich auch dafür sorgen, dass der Browser die richtige Zeichencodierung (idealerweise eben UTF-8) benutzt.
Ich benutze header ('Content-Type: text/html;charset=utf-8');[/lang] im PHP-Skript und [code lang=html]<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
im Output.
- Und der Browser selbst muß UTF-8 dann natürlich nicht nur kriegen, sondern auch verarbeiten können.
Das Problem tritt unabhängig vom Browser auf.
Es scheint also irgendwie an der Abfrage zu hapern. Mir fehlt nur leider jede Idee, woran es liegen könnte.
Hi,
Danke für Deine Anmerkungen, allerdings ist jede davon erfüllt.
D.h., Du bildest dir den Fehler nur ein? *SCNR* ;-)
Vielleicht hilft dir der in Codierung einer XML Datei herausfinden und korrigieren gepostete Code ja rauszufinden, wer bei dir der "Verhunzer" ist.
Gruß, Cybaer
Hallo, für's Archiv:
der Fehler lag darin, dass der DB-Server den Befehl SET NAMES='utf8';
nicht verwertete. Die Codierung der Verbindung war also immer noch latin1.
Das Ganze lässt sich aber auch durch folgende Befehlskette erreichen:
SET character_set_client='utf8';
SET character_set_connection='utf8';
SET character_set_results='utf8';
Danach funktioniert alles wie gewünscht.
Viele Grüße,
David