Hauptmenü

Untermenü

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