utf8-Verständnisfrage

Arndtinho

Erfahrenes Mitglied
Hallo,

ich möchte die Datenbank (MySQL) einer Anwendung für Mehrsprachigkeit umstellen und nutze dafür bekanntlicherweise UTF-8.
Folgende Änderung habe ich vorgenommen: ini-Datei von MySQL:
Code:
[ mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
Apache.conf:
Code:
AddDefaultCharset utf-8
php.ini
Code:
default_charset = "utf-8"

[mbstring]
mbstring.language = utf-8
mbstring.internal_encoding = utf-8
mbstring.http_input = utf-8
mbstring.http_output = utf-8
in meiner Testdatei: test.php
PHP:
header( 'content-type: text/html; charset=utf-8' );
$con = mysql_connect( 'host', 'user', 'password' );
   mysql_select_db( 'database', $con ); ...
Danach den Rechner neu gestartet. Jetzt habe ich erwartet, dass mir die Inhalte der DB-Tabelle ordnungsgemäß angezeigt werden, aber statt dessen werden alle Sonderzeichen (chin., russ., griech., ä's, ü's und ö's) als Fragezeichen angezeigt. Die test.php ist als utf8-kodiert abgespeichert. Nun meine Frage: Wieso werden die Sonderzeichnen nicht richtig dargestellt?
Denn wenn ich alle Änderungen rückgängig mache und ein einfaches
PHP:
mysql_query( 'SET NAMES utf8' );
nach dem Connect zur Db schicke, funktioniert alles reibungslos.
 
mit UTF-8 hatte ich auch schon viele Probleme ... anscheinend funktioniert das nicht so wie es soll. Musst dich wohl mit solchen Charsets begnügen, UTF ist aus mir unbekannten Gründen nicht wirklich eine Option, ständig werden Zeichen falsch angezeigt bzw. nicht erkannt
 
Hi

Haben die entsprechenden Spalten auch den richtigen Datentyp. Für die Spalten muss auch angegeben werden, dass sie Unicode-Daten speichern sollen.
 
Zunächst muss ich sagen, dass ich so aus dem Blauen heraus nicht sagen kann, wo das Problem liegt -- ich kann nur aus Erfahrung sprechen. Ich habe bereits recht umfangreiche Anwendungen mit PHP und MySQL aufgebaut, die UTF-8 verwenden -- dabei traten nie Schwierigkeiten auf. Ich kann aber dennoch mal kurz auflisten, worauf man achten sollte:

- PHP-Dateien, die HTTP-Header senden, dürfen keinesfalls als UTF-Textdateien gespeichert werden, weil sonst die BOM (Byte-Order-Mark) automatisch am Dateianfang eingefügt wird. Dies führt dazu, dass bereits Content an den Client geschickt wird, bevor der PHP-Code den HTTP-Header senden konnte. UTF-PHP-Code muss als ANSI-Datei gespeichert werden.

- Auch wenn der MySQL-Server, die Datenbank mit all ihren Tabellen und die Spalten auf UTF-8 gestellt sind, bedeutet das keineswegs, dass automatisch UTF-8 gesendet wird. Es wird genau das gesendet, was sich in den Spalten befindet -- sollte das kein UTF-8 sein, bekommt man auch keins. Du musst also bereits UTF-8 an den Server liefern, damit du auch welches zurückbekommst.

-Gawayn
 
Hallo,

> PHP-Dateien, die HTTP-Header senden, dürfen keinesfalls als UTF-Textdateien gespeichert > werden

Das habe ich auch schon probiert, aber erhielt trotz dessen eine fehlerhafte Anzeige.
Da ich den Aufbau der Db-Connection in einer Klasse gekapselt habe, schicke ich nach dem Connect ein
PHP:
mysql_query( 'SET NAMES '.$this->CharSet );
an die Db und es funktioniert alles so wie es soll. Das ist zwar eine Codezeile mehr, aber so steht utf-8 für alle Projekte zur Verfügung.

Gruß
Arndtinho
 
Zurück