echo $begrüßung;
Zum Beispiel habe ich ein ˆ statt ö oder ein ÷ statt Ö.
Das sieht nach MacRoman aus.
Byte MR ISO-8859-1
xD6 ÷ Ö
xF6 ˆ ö
Vom Hersteller der Datei habe ich auf Nachfrage nach dem Zeichensatz in der DB folgende Infos bekommen:
german(de-utf8)
MySQL-Zeichensatz: UTF-8 Unicode (utf8)
Zeichensatz / Kollation der MySQL-Verbindung utf8_general_ci
Das ist die Ausgabe der Titelseite von phpMyAdmin. Die erste Zeile ist phpMyAdmins eingestellte Sprache und Kodierung in Richtung Browser, die dritte Zeile ist phpMyAdmins Einstellung für die Kommunikation zur DB. Daraus kann man keinerlei Schlussfolgerungen für eigene Verbindungen zur DB ziehen.
(Woher phpMyAdmin die Information für die zweite Zeile nimmt, ist mir derzeit noch unklar. Das Umstellen meines Servers auf latin1 ließ ihn nicht davon abbringen, dort weiterhin utf8 anzuzeigen.)
Für deine Script gelten entweder die Server-Default-Werte character_set_client, character_set_connection und character_set_results (nachzulesen im phpMyAdmin auf der Seite "MySQL-System-Variablen anzeigen" in der (so vorhanden) mit "(Globaler Wert)" gekennzeichneten Zeile) oder der individuell ausgehandelte Wert. Stichwort: SET NAMES ...
bei den Namen latin1_german2_ci
Dieser Wert gibt an, welchen Zeichenvorrat Werte in diesem Feld haben. Weicht die Kodierung der Felder von der der Verbindung ab, übersetzt MySQL zwischen beiden hin und her. (Technisch bedingt kann es dabei auch zu Datenverlust kommen.)
Und das Problem tritt natürlich in den Namen auf. Stelle ich meine DB jetzt auch auf utf-8 ein oder latin1?
Das kommt darauf an, welchen Zeichenvorrat du berücksichtigen willst. Die in Westeuropa üblichen Zeichen: latin1. Alle möglichen: utf8. Wenn du dich für utf8 entscheidest, solltest du das auf ganzer Linie fahren, sonst gibt es Datenverlust beim Umwandeln.
Sehe ich die Sonderzeichen nur, weil ich einfach nur print_r mache und damit keinen Zeichensatz in der angezeigten "HTML"-Seite habe?
Die verwendete Zeichenkodierung sollte im HTTP-Header Content-Type angegeben werden. Ersatzweise im gleichnamigen http-equiv-Meta-Element im HTML-Header. Wenn der Browser keine Kodierungsangabe findet muss er raten oder seine Default-Einstellung verwenden. Der Browser muss immer eine Zeichenkodierung verwenden, sonst könnte er nur Byte-Werte anzeigen.
Im Zweifelsfall solltest du dir die Byte-Werte der Zeichen *) ansehen und mit Zeichentabellen (liegen genügend in der Wikipedia rum) vergleichen.
*) möglichst nah an der Quelle, sonst können schon wieder beteiligte Systeme daran etwas uminterpretiert/umkodiert haben.
echo "$verabschiedung $name";