dedlfix: UTF-8 und MySQL

Beitrag lesen

echo $begrüßung;

Programmiere grade ne Homepage und nun habe ich eine Seite integriert die den Content von der Datenbank abruft.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

Der Doctype ist komplett uninteressant für Zeichenkodierungsprobleme.

(Charset steht auf Automatisch im FF)

Der Browser richtet sich immer nach den Angaben des Webservers, wenn im HTTP-Header Content-Type eine charset-Angabe mitgegeben wurde. Fehlt diese versucht er

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

dieses Meta-Element auszuwerten. Der Firefox beispielsweise zeigt über Rechtsklick (Kontextmenü) Seiteninformation (bzw. Frame-Information bei Frames-Seiten) an, mit welcher Kodierung er die Seite zu interpretieren versucht. Es gibt auch die livehttpheaders-Extension, mit der sich die Response-Header ansehen lassen, um die HTTP-Header-Angaben zu prüfen.

Der Text der über die Datenbank abgerufen wurde, wird korrekt dargestellt und der restliche text (NUR auf dieser Seite) mit Sonderzeichen (öäa).

Sieht aus, als ob die Seite gerade mit Latin1/ISO-8859-1/Win-1252 interpretiert wird, der "restliche Text" aber UTF-8-kodiert ist.

D.h., um das mal zu verstehen, der Browser merkt ah da sind 2 verschiedene Charsets in einem Dokument und muss sich für eins entscheiden, oder?

Der Browser rät nur dann, wenn er keine der beiden charset-Angaben findet.

Obwohl ich aber in der Datenbank öäü und im eigentlichen .php-file welches Inkludiert wird Sonderzeichen im Klartext verwendet habe.

Die entscheidende Frage ist immer, in welcher Kodierung diese Zeichen vorliegen und wie das Programm, mit dem du die Zeichen anschaust, sie interpretiert.

Obwohl die Datenbank ebenfalls auf UTF-8 eingestellt ist ...

Es gibt beim MySQL-Server insgesamt 10 verschiedenartige Stellen, an denen eine Kodierung eingestellt werden kann. Die beiden wichtigsten sind die Kodierung der einzelnen Felder und die Kodierung auf der Verbindung zu Clients. Letztere wird mit der MySQL-API-Funktion mysql_set_character_set() festgelegt. Zu dieser Funktion gibt es auch Pendants in anderen APIs. Eine Alternative wäre SET NAMES, beschrieben auf der vorher verlinkten Seite.

... werden die Umlaute als Sonderzeichen (�) dargestellt und der Rest korrekt.

Das wird an der Default-Einstellung Latin1 liegen. Wenn du UTF-8 auf deiner Verbindung haben möchtest, dann sag der das nach dem Öffnen. Wenn du im Browser unter dem Menüpunkt Ansicht (Zeichen-)kodierung mal auf ISO-8859-1 bzw. Win-1252 umstellst, wirst du sicher sehen, dass dann die Datenbankumlaute richtig dekodiert werden können.

echo "$verabschiedung $name";