echo $begrüßung;
Danke erstmal für deine ausführlichen Antworten.
Allerdings wächst mir das ja schon fast wieder aus den Ohren raus, solche Probleme mit den Codierungen hatte ich ja noch nie.
Wenn alle Systeme die gleiche Kodierung verwenden, gibt es da auch keine.
Ich denke der META Tag in der Ausgangsseite ist also zu vernachlässigen, ok?
Nur dann, wenn es in den HTTP-Headern eine charset-Angabe in der Content-Type-Zeile gibt. Bei lokal gespeicherten Webseiten gibt es keine HTTP-Übertragung und dann ist diese Meta-Angabe nicht ganz unwichtig, wenn man auf richtig angezeigte Zeichen Wert legt :-)
ich habe festgelegt: $s_name = "bäumer";
In welcher Kodierung liegt dein Script vor und damit besagter Wert?
Nun, das Script, elches die Datenbankabfrage startet ruft erstmal gar keinen Code Befehl auf.
Die Kodierung des Scripts legst du im Editor beim Abspeichern fest. Wenn der Editor da keine Möglichkeit anbietet, wird es die Defaulteinstellung des Systems sein: Windows1252 (weitgehend ISO 8859-1-kompatibel).
Dann habe ich mir mal den gebastelten SQL String per echo zurückgeben lassen und auf einmal macht er aus dem Variableninhalt folgendes: "b?er"
Also mein IE Browser hier steht auf UNI-Code UTF-8 und links-nach-rechts Ausgabe, also standard denke ich mir.
Das passt zu dem angezeigten Fragezeichen. Ein nach ISO 8859-1 kodiertes Umlautzeichen ist eine ungültige UTF-8-Sequenz.
Und weiter geht's mit einer wichtigen Komponente. Unter welcher Version läuft dein MySQL-Server? [...]
Au mein Gott, wem sagst du das, ich dachte, ich platze...
Ruhig Blut, es wird nichts so heiß gegessen wie es gekocht wird.
Es ist zwar wichtig zu wissen, wo MySQL überall mit Zeichenkodierungen hantiert, für die praktische Arbeit ist aber eigentlich nur das passende "SET NAMES ..." nach dem Connect wichtig.
MySQL läuft auf unserem Server 4.1.13 und der codiert wirklich jeden Furtz...
Wir haben eigentlich alles auf standard gelassen bzw. Latin-1 glaub ich als Standard vorgegeben, dann hatte er beim Import aus dem alten Server damals auch alle Umlaute richtig mitgenommen.
Wichtig ist, dass du zur Kommunikation mit dem Server selbigem mitteilst, welche Kodierung zu verwenden sei und alles wird gut. Wenn der phpMyAdmin alles richtig anzeigt, sind deine Daten in Ordnung.
Die Kollationen sind in allen Tabellen gleich und alle Abfragen funktionieren ja auch mit den Umlauten, nur AJAX stellt sich jetzt quer.
AJAX arbeitet mit XML, da ist UTF-8 die Standard-Kodierung. Es wäre ratsam, wenn du alle Beteiligten auf die Verwendung von UTF-8 umstellst.
So allmählich bin ich geneigt unsaubere Maßnahmen zu ergreifen und alle Umlaute vor dem absenden einfach in "ae" und ähnlichem umzuwandeln und in der PHP Routine wieder zurück, bevor ich mir hier einen heißen suche.
Wer wird denn gleich. Damit tauschst nur das eine Problem gegen ein anderes aus. Und was machst du, wenn Javascript ausgeschaltet ist?
Nehmen wir mal an, du möchtest durchgehend UTF-8 verwenden. Das setzt voraus, dass du mit PHP kaum Stringverarbeitung machen möchtest, da diese Funktionen noch nicht fähig sind, mit Mehrbyte-Zeichenkodierungen richtig umzugehen. ein strlen('Müller') liefert 7 zurück, weil das ü aus zwei Bytes besteht, und auch substr() schneidet an den falschen Stellen. Wenn du solcher Art Stringverarbeitung nicht machst, sondern die Werte einfach nur durchreichst, musst du dir um PHP keine großen Sorgen machen.
Die Daten in der Datenbank werden günstigerweise auch UTF-8-kodiert gespeichert. MySQL nimmt zwar Umwandlungen vor, wenn die Connection mit UTF-8 läuft und die Felder auf latin1 eingestellt sind, aber mit 256 möglichen Werten ist latin1 doch recht begrenzt. Nimm dir den phpMyAdmin und wähle die Datenbank aus. Stelle dort unter "Operationen" den Wert für "Kollation" auf utf8_general_ci oder utf8_unicode_ci um. Der Unterschied zwischen beiden Werten ist im Handbuch-Kapitel Unicode Character Sets beschrieben. Für die Tabellen kannst du analog verfahren. Bei den Feldern sind nur die String-Felder zu berücksichtigen, also die bei denen in der Übersicht in der Spalte Kollation ein Wert eingetragen ist. Wenn du diese Angabe änderst, wandelt MySQL die gespeicherten Werte in die neue Kodierung um.
Nach einem Datenbank-Connect sendest du ein "SET NAMES utf8" und bekommst die Werte UTF-8-kodiert ausgeliefert. Natürlich musst du nun auch UTF-8-kodierte Werte senden.
Deine Scripte und sonstwo herkommenden Texte müssen auch UTF-8-kodiert gespeichert werden. Zur Not musst du die Daten mit utf8_encode() umwandeln, wenn die Quellen unbedingt ISO 8859-1 bleiben müssen. Den Browsern sendest du die charset-Angabe im HTTP-Header und im Meta-Element. Ein accept-charset-Attribut in den Form-Elemente sollte dem Browser letzte Zweifel beim Kodieren der zurückgesendeten Daten nehmen. Für noch schwerwiegendere Fälle gibt es einen Lösungsvorschlag auf den MySQL-Seiten im Artikel Unicode and Other Funny Characters.
echo "$verabschiedung $name";