PHP, MySQL und der Ärger mit UTF-8
Wenn ein Dokument als Unicode (UTF-8) abgespeichert wurde, jedoch als ISO 8859-1 interpretiert wird, geschieht folgendes:
erwartete Ausgabe: ä ö ü
wirkliche Ausgabe: ä ö ü
Mit PHP kann man dieses Problem umgehen indem man den entsprechenden Header ändert:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><?php
header('Content-Type: text/html; charset=UTF-8');
?>
Wenn die Umlaute als Fragezeichen dargestellt werden, dann wird ein als ISO 8859-1 kodiertes Dokument als UTF-8 interpretiert. Dies stellt das Gegenstück zur oben genannten Situation dar.
erwartete Ausgabe: ä ö ü
wirkliche Ausgabe: � � �
Auch hier lässt sich mit PHP's header()-Funktion nachhelfen, damit der Content als ISO-8859-1 interpretiert wird.
<?phpheader('Content-Type: text/html; charset=ISO-8859-1');
?>
Tückisch wird es bei Datenbankanbindung, wenn die Datenbank ISO-8859-1 kodiert ist.
Trick: gleich nach dem Öffnen der DB folgenden Befehl absetzen:
mysqli_query($verbindung, "SET NAMES 'utf8'");
Das sorgt dafür, dass der Datenbankserver weiß, dass er sowohl bei Datenbankabfragen als auch bei Inserts oder Updates mit UTF-8-codierten Daten arbeiten soll. Diese Methode ist deutlich effizienter als das ständige "utf8_encode".
Wenn möglich kann man auch die PHP.INI anpassen:
default_charset = "UTF-8"[iconv]
iconv.input_encoding = UTF-8
iconv.internal_encoding = UTF-8
iconv.output_encoding = UTF-8
[exif]
exif.encode_unicode = UTF-8
[mssql]
mssql.charset = "UTF-8"
Und genau so die MySQL-Konfiguration in /etc/mysql/my.cnf. Damit entfällt der o.g. SQL-Befehl.
[client]default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8