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.

<?php
header('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
2016-01-29 15:16 Uwe Kernchen {writeRevision}
Durchschnittliche Bewertung: 0 (0 Abstimmungen)

Es ist möglich, diese FAQ zu kommentieren.

Chuck Norris has counted to infinity. Twice.