echo $begrüßung;
Dabei gehen die vom Benutzer gemachten Eingaben folgenden Weg:
Eingabe ins Formular auf der HTML-Seite,
Hier ist die Kodierung noch nicht wichtig, beziehungsweise du hast da keinen Einfluss drauf, das ist Angelegenheit zwischen Betriebssystem und Browser.
Übertragung der Daten via Ajax,
AJAX hantiert praktisch nur mit UTF-8. Wenn du versuchst, da etwas anderes zu machen, wirst du nicht glücklich damit.
Verarbeitung Server-seitig von einem PHP-Skript
Du bekommst also wegen der AJAX-Übertragung die Daten UTF-8-kodiert.
und vom selben Skript senden der Daten an die Datenbank via mysql_query();
Und bei der Übertragung zum DBMS solltest du mit diesem explizit aushandeln, welche Kodierung auf der Verbindung verwendet werden soll. Wichtig ist, die angegebene Kodierung auch wirklich zu vewenden. Und selbst festlegen ist besser als sich auf irgendeinen Default-Wert zu verlassen. mysql_set_charset() oder als Ersatz ein "SET NAMES"-Statement sind passende Werkzeuge.
Und dann müssen die einzelnen (String-)Felder auch noch die Zeichen speichern können, sollten also auch auf UTF-8 gestellt sein. (Tabellen- und Datenbankkodierungen sind nicht maßgebend.)
Nja gut und irgendwo auf diesem Weg werden mir die Sonderzeichen wie ä,ö,ü und ß durcheinander gebracht.
Wenn du bisher mit ISO-8859-1 hantiert hast und das partout nicht ändern möchtest, kannst du Umkodierungen vornehmen, die aber prinzipbedingt nicht verlustfrei durchgeführt werden können. Eine mögliche Stelle dafür wäre zwischen AJAX und PHP. Von AJAX mit utf8_decode() und dorthin mit utf8_encode().
Die beste Empfehlung ist jedoch, sich mit der Problematik grundlegend auseinanderzusetzen und durchweg zu UTF-8 zu greifen.
Wenn ich mir die Daten in phpMyAdmin ansehe, sind dort die Sonderzeichen durch so Sachen wie "ü" ersetzt und natürlich bekomme ich auch keine Sinnvollen ausgaben, wenn ich mir Daten aus der Datenbank mit eigenem Skript wieder auslese.
Das bedeutet, das die Daten UTF-8-kodiert zum DBMS gesendet wurden, dieses jedoch annahm, dass es Latin1 bekommt. Damit hast du erst einmal ein Problem, das du lösen musst. Prüfe zunächst, ob alle Umlaute betroffen sind und nicht etwa welche aus Zeiten von vor der AJAX-Implementierung richtig angezeigt werden (im phpMyAdmin). Wenn alles gleich verunstaltet ist, exportier die Daten als SQL-Dump. Nun solltest du doppelt UTF-8-kodierte Daten im Dump vorfinden, denn PMA exportiert ohne iconv- oder recode-Extension immer UTF-8. (Kann man prüfen, indem man die Datei im Browser öffnet, und über das Menü Ansicht->Zeichenkodierung auf ISO-8859-1 stellt und vier Zeichen pro Umlaut sieht oder bei UTF-8 zwei.) Dann brauchst du einen Editor, der die Datei als UTF-8 öffnet und als ISO-8859-1 speichert. Nun hast du nur noch einfach UTF-8-kodierte Daten und kannst beim Import angeben, dass die Kodierung UTF-8 ist. Wenn dir die Kommandozeilentools von MySQL zur Verfügung stehen (Programm mysqldump), kannst du damit exportieren, wobei du als Kodierung Latin1 angeben solltest (da gibt es einen Parameter für). Nun kannst du als UTF-8 importieren.
Wichtig ist, immer eine Sicherheitskopie anzufertigen beziehungsweise erst einmal mit einer Kopie üben.
Was zur Verwirrung hinzu kommt ist, dass ich mit einer anderen Anwendung die folgenden Verarbeitungsweg nutzt keine Probleme mit den Sonderzeichen habe:
Beziehen der Daten aus einer XML-Datei durch PHP-Skript,
Wie liest du die XML-Daten? Die bekannten XML-Komponenten stellen dir die Inhalte normalerweise auch UTF-8-kodiert zur Verfügung.
verarbeiten der Daten durch selbiges PHP-Skript und Übertragung dieser Daten in die Datenbank via mysql_query();
Was auch immer "verarbeiten meint" - vermutlich nichts was die Kodierung ändert - diese beiden Schritte sind ja eigentlich die gleichen wie oben.
Mit diesem Vorgehen, habe ich keine Probleme alle Sonderzeichen werden korrekt dargestellt.
Hmm, das hört sich so an, als ob du Mischmasch in den Daten hast. In dem Fall bleibt vermutlich nur eine aufwendige händische Korrektur.
Die Textfelder der Datenbank sind in den beiden Tabellen jeweils mit "latin1_swedish_ci" formatiert.
Die Feldkodierung sagt nur aus, welche Zeichen überhaupt aufgenommen werden können. Die Kommunikation von und zum Client bedient sich einer eigenen Kodierungskonfiguration. Wenn beide Einstellungen unterschiedlich sind, kodiert MySQL selbständig zwischen beiden um. (Geht natürlich nicht in jede Richtung verlustfrei.)
echo "$verabschiedung $name";