dedlfix: AJAX - Datenübergabe und deren Codierung

Beitrag lesen

echo $begrüßung;

Die Webseite selber:
<meta name="Content-Type" content="text/html; charset=iso-8859-1">

Das sagt dem Browser, dass die Zeichen dieses Dokuments gemäß ISO 8859-1 kodiert sind. Ein A ist beispielsweise durch den Wert 65, ein Ä durch 196 und umgekehrt, sollte der Wert 196 durch ein Ä dargestellt werden. Mit UTF-8 werden Zeichen jenseits von ASCII (lateinische Buchstaben, Ziffern und ein paar Satzzeichen) mit 2 bis 4 Bytes kodiert. Interpretiert man nun diese Bytes gemäß ISO 8859-1, sieht man entsprechend 2 bis 4 Zeichen. Die Bytes eines UTF-8-Zeichens müssen bestimmten Regeln entsprechen. Nicht jede Bytekombination ist also zulässig. Ein in ISO 8859-1 kodierter Text enthält bei Verwendung von Umlauten solche unzulässigen Bytefolgen, was dann mit einem Fragezeichen und ggf. dem Verlust nachfolgender Zeichen quittiert wird, bis wieder eine erlaubte Bytereihenfolge auftaucht.

Die Angabe in diesem Meta-Element ist aber nur ein Ersatzwert. Wenn in den HTTP-Headern ebenfalls eine charset-Angabe im Content-Type steht, so hat diese Vorrang. HTTP-Header kann man sich beispielsweise mit der livehttpheaders-Extension des Firefox anzeigen lassen.

Jetzt mal was neues probiert, der Request Content der AJAX Routine:
http_request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset:iso-8859-1' );

Ich bin mir nicht sicher, ob das so erlaubt ist. Wobei ich mir aber sicher bin: Es wird keine Wirkung auf die Kodierung der Zeichen haben. Es reicht nicht, auf einen Umschlag "100 Euro" zu schreiben, dadurch füllt er sich nicht automatisch. setRequestHeader() wird eine allgemeine Methode sein, um jede Art von HTTP-Header zu setzen. Sie wird den zu setzenden Inhalt nicht auswerten und danach handeln. Wenn du dem http_request sagen möchtest, in welcher Kodierung es die Daten versenden soll, wirst du eine eigens dafür vorgesehene Methode aufrufen müssen.

Ich bin mal hingegangen und habe der eigentlich per POST übergebenen Suchvariablen in dem PHP Script einfach mal einen festen Wert zugewiesen um zu sehen was das Script macht.
ich habe festgelegt: $s_name = "bäumer";

In welcher Kodierung liegt dein Script vor und damit besagter Wert?

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"
Was ist da jetzt passiert? Da spielt doch irgendeine Codierung mit, oder? Aber welche und wie?

Welche Kodierung, nimmt der Browser, an hätten deine Daten?
(Firefox: Rechtsklick->Seiteninformationen anzeigen; oder im Menü Ansicht unter Zeichenkodierung nachsehen, welche markiert ist. Wähle einen anderen Wert aus. Wenn die Umlaute dann richtig dargestellt werden, liegen die Daten in dieser Kodierung vor (oder diese Kodierung passt zufälligerweise auch auf die Testdaten).

Wie ich merke, das der SQL Aufruf keine Ergebnisse liefert? Nun, wenn der Aufruf mysql_query($sql_string) FALSE zurück liefert, war das wohl nix...

Gut. Den Rückgabewert der mysql_*-Funktionen auszuwerten ist immer eine gute Idee. Aber was sagt mysql_error() dazu?

Und weiter geht's mit einer wichtigen Komponente. Unter welcher Version läuft dein MySQL-Server? 4.0 und kleiner oder 4.1 und größer? Bis Version 4.0 konnte MySQL noch nicht mit UTF-8 umgehen. In Version 4.1 wurde dem Thema Zeichenkodierung besondere Aufmerksamkeit geschenkt. Man kann nun an sehr vielen Stellen angeben, welche Kodierung für diese Stellen verwendet werden soll. Um nur zwei zu nennen: Für jedes Feld kann eine andere Kodierung verwendet werden, selbst jedes String-Literal kann in einer anderen Kodierung notiert werden. Und damit der Server die Bytes richtig dekodieren kann, und gegebenenfalls in andere Kodierungen wandeln kann, muss er genau wissen, welche Kodierung vorliegt. Für dich ist momentan wichtig, welche Kodierung zur Kommunikation mit dem Client (dein PHP-Script) verwendet werden soll. Diese stellt man am besten mit einem expliziten "SET NAMES ..."-Statement, welches man direkt nach dem Connect sendet, auf einen definierten Wert ein. Damit interpretiert der Server die ankommenden Daten gemäß dieser Kodierung und gibt die Ergebnisse ebenfalls in dieser Kodierung zurück. Wenn für die Felder in den Tabellen andere Kodierungswerte eingestellt sind, nimmt der Server automatisch Umwandlungen vor. Dabei kann es auch prinzipbedingt zu Verlusten kommen, wenn sich Zeichen nicht mit der Zielkodierung darstellen lassen. (Auch deswegen ist die durchgehende Verwendung von UTF-8 eine gute Idee.)

echo "$verabschiedung $name";