Zeichenkodierung - PHP
1. Die Abschnitte
2. Ein wichtiger Hinweis
Offenbar reagieren hier manche Browser ein wenig seltsam, wenn man etwas im PHP-Code ändert. Ich selber habe das noch nicht ganz ausbaldowert, aber
ihr solltet auf jeden Fall nach Änderungen im Code den Cache löschen, um auf der sicheren Seite zu sein. Denn irgendwie merken die sich
beim erstmaligen Aufruf einer Seite das eine oder andere Mal die Angabe des Zeichensatzes. Und jetzt öffnet bitte die Datei
php.php
im Ordner php
.
3. Der Anfängerstil
Man programmiert genau so, wie man es schon zig Mal gemacht hat. Verbindung aufbauen, Datenbank aussuchen, Abfrage abschicken und ausgeben.
<?php
$con = mysql_connect('euer_host','euer_benutzer','euer_pw');
$db = mysql_select_db('zeichenkodierung');
$res = mysql_query ('SELECT unicode FROM daten');
while ($row = mysql_fetch_assoc($res))
{
echo '<p>'.$row['unicode'].'</p>';
}
?>
Aber
Das führt in diesem Fall leider dazu, dass man außer Fragezeichen nicht viel zu sehen bekommt. Und das kann einige Gründe haben.
4. Fragen
Die sollte man sich auf jeden Fall stellen, wenn diese Situation eintritt. Kommen wir zuerst zu den Naheliegendsten.
Welche Zeichenkodierung hat meine PHP-Datei?
Wenn die zum Beispiel auf ANSI
steht, so habt ihr hier einen ersten möglichen Fehler. Genau so wie in der HTML-Datei aus
dem dritten Abschnitt dieses Tutorials. Also solltet ihr das entsprechend anpassen. Ach ja, es kann auch sein, dass euer Apache so
eingestellt ist, dass er automatisch UTF-8
sendet (AddDefaultCharset
). Aber darauf sollte man sich nicht
verlassen.
Sende ich einen korrekten Header mit den notwendigen Informationen?
Auch hier spielt unter Umständen die Apache-Konfiguration (siehe oben) eine Rolle. Aber um auf Nummer sicher zu gehen, sollte man das tunlichst machen. Und zwar am Beginn des Codes mit
header("Content-Type: text/html; charset=utf-8");
5. Und wenn das nichts hilft?
Dann habt ihr das wohl Wichtigste vergessen. Nämlich dem MySQL-Server mitzuteilen, welchen Zeichensatz ihr gerne verwenden möchtet. Dazu muss einmalig vor jedweder weiteren Abfrage folgendes Statement ausgeführt werden.
mysql_query ('SET NAMES utf8');
6. Zusammenfassung
Also sollte euer Code in einer UTF-8
-kodierten PHP-Datei für eine korrekte Darstellung im Browser so aussehen.
Probiert es aus!
<?php
header("Content-Type: text/html; charset=utf-8");
$con = mysql_connect('localhost','root','');
mysql_select_db('zeichenkodierung');
$code = mysql_query ('SET NAMES utf8');
$res = mysql_query ('SELECT unicode FROM daten');
while ($row = mysql_fetch_assoc($res))
{
echo '<p>'.$row['unicode'].'</p>';
}
?>
Noch was
In diesem Beispiel griffen wir nur auf das Feld unicode
zu. Stellt das mal um und nehmt das Feld general
. Dann
werdet ihr sehen, dass es ebenfalls wunderbar funktioniert. Aber was ist nun der Unterschied? Auf jeden Fall ein ziemlich kleiner aber
gravierender. utf8_unicode_ci
ist neueren Datums als utf8_general_ci
und es werden Erweiterungen unterstützt.
So wird zum Beispiel im Deutschen das ß
mit ss
gleichgesetzt. Herzlichen Dank an all die Leute, die für diese
völlig verkorkste Rechtschreibreform verantwortlich sind. utf8_unicode_ci
kommt also damit klar, utf8_general_ci
nicht.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt