echo $begrüßung;
2.) Alle meine Seiten sind utf-8 codiert, die Grundeinstellung meiner Datenbank ( MySQL - 4.1.21, Änderungen vorgenommen via phpMyAdmin - 2.8.0.2 ) sind :
MySQL-Zeichensatz: UTF-8 Unicode (utf8)
Zeichensatz / Kollation der MySQL-Verbindung: utf8_unicode_ci
Das sind die Werte, die der phpMyAdmin sich eingestellt hat. Sie gelten für die Verbindung zwischen PMA und dem MySQL-Server, jedoch nicht für andere Clients, wie beispielsweise deine Scripte.
Der MySQL-Server geht davon aus, dass die Clients mit ihm in der Zeichenkodierung gemäß seiner Einstellung des Parameters character_set_client kommunizieren. Der PMA zeigt dir den aktuellen Wert und die Default-Einstellung (falls beide abweichen) auf der Seite "MySQL-System-Variablen anzeigen" an. MySQL wandelt gegebenenfalls Daten in dieser Kodierung (A) in die Kodierung um, die für die Felder eingestellt ist (B). Wenn die Daten doch nicht gemäß A kodiert sind oder auch, wenn sich A nicht verlustfrei nach B konvertieren lässt, gibt es Datenverlust.
character_set_client gilt übrigens nur für die Richtung zum Server. Die Ergebnisdatensätze werden in der Kodierung gemäß character_set_results ausgeliefert, und dabei wieder ggf. aus der Kodierung der Felder in diese Kodierung umgewandelt.
Die einfachste Lösung ist, nach dem Verbindungsaufbau explizit festzulegen, welche Kodierung auf der Verbindung verwendet werden soll. Dazu sendet man ein SET NAMES charset_name.
Wenn man jetzt Daten mit Umlauten über das Webformular eingibt und aufspielt, werden diese bei der Datenauslese wieder völlig korrekt dargestellt. Wenn ich mir die Daten aber direkt im phpMyAdmin ansehe, sind sie dort verunstaltet ( zB "Müller" statt "Müller" ). Ist das normal?
Es sieht ganz danach aus, dass der MySQL-Server annimmt, dass die Daten in ISO 8859-1 bzw. Latin1 vorliegen, und trägt sie, gegebenenfalls umkodiert, in die Felder des Datensatzes ein. Ohne eine Inhaltsanalyse lässt sich nicht feststellen, ob etwas tatsächlich gemäß ISO 8859-x kodiert ist, da sich dies nicht ohne weiteres anhand von Bytewerten oder Bytereihenfolgen erkennen lässt. Nur bei UTF-8 kann man erkennen, wenn ein Text nicht in dieser Kodierung vorliegt.
Ich vermute, dass du die Kodierung deiner String-Felder (siehe PMA-Spalte Kollation) auf UTF-8 eingestellt hast. MySQL wird in deinem Fall annehmen, ISO 8859-1 geliefert zu bekommen (M(FC)ller), bekommt stattdessen aber ein UTF-8-M(C3-BC)ller, und wandelt dieses zum Speichern in UTF-8 um (M(C3-83-C2-BC)ller) und beim Ausliefern wieder zurück nach ISO 8859-1 (M(C3-BC)ller). PHP deklariert das dem Browser gegenüber als UTF-8, der freut sich, und alles ist in Ordnung.
Der PMA kann dir nur Müller anzeigen, da er aus dem UTF-8-String M(C3-83-C2-BC)ller nur Müller (C3-83=Ã, C2-BC=¼) machen kann.
Und was ich auch nicht verstehe : Wenn ich "Müller" direkt über phpMyAdmin eingebe, dann sehe ich den Namen dort korrekt geschrieben, ausgegeben wird dann aber "M?ller".
Die Eingabe im PMA wird ordnungsgemäß als UTF-8 deklariert - der hat sein SET NAMES richtig gesendet - und auch so kodiert an den MySQL-Server ausgeliefert. Dieser kann den Wert nun ordentlich UTF-8-kodiert in das Feld eintragen. Beim Ausliefern an dein Script wandelt er es nach ISO-8859-1 um (M(FC)ller), was aber keine gültige UTF-8-Sequenz mehr ist und deinen Browser veranlasst, ein Fragezeichen statt des ü anzuzeigen. Stell mal deinen Browser über Ansicht->(Zeichen)kodierung auf ISO 8859-1 um und du wirst ein ü sehen.
M(C3-BC)ller ... (C3-BC) soll die Byte-Werte darstellen.
3.) ausgabe.php ( = NICHT validierbar !!! ) Wieso?
Das hat der Validator doch hingeschrieben. Du lieferst ihm Datenmüll aus und kein korrekt UTF-8-kodiertes Dokument.
4.) Da ich niemanden persönlich kenne, der php - kompetent ist, vielleicht kann sich ja mal wer kurz den Code der beiden php-Seiten ansehen und mir sagen, ob das so in Ordnung ist, wie ich den php-Code geschrieben habe. Oder kann man das für ein und das Selbe Vorhaben besser machen?
Dein Server liefert keinen PHP-Quelltext aus. Leg die Dateien nochmal mit der Erweiterung .phps an oder erzeuge einen Symlink.
echo "$verabschiedung $name";