[AJAX] Fehler in der Zeichenkodierung

Da Hacker

Erfahrenes Mitglied
Hallo Tutorials.de-Community,

ich habe nach meinem Serverumzug ein Problem mit der Zeichenkodierung bei meinem Projekt, aber auch generell Verständnislücken zu diesem Thema.

Es geht darum, dass Leute Kommentare zu Bildern geben können. Diese Kommentare werden über ein AJAX-Script an eine PHP-Datei gesendet und dort in die Datenbank geschrieben.

Ihr könnt euch dazu gerne hier das aktuelle Projekt ansehen. Einfach ein Vorschaubild anklicken und in der unteren Leiste auf "Kommentar hinzufügen" klicken.

Das Problem:
Wenn jemand einen Kommentar mit Umlauten abschickt, dann werden diese in der Datenbank nicht normal, sondern in dieser Form gespeichert:
Originaleintrag hat gesagt.:
Meine Nachricht: ööäüöÖPÜLÜÄL
Datenbank hat gesagt.:
Meine Nachricht: ööäüöÖPÜLÜÄL
Die Anzeige des Kommentars (auch mit AJAX realisiert) wird dann seltsamerweise richtig dargestellt Ich habe auch durchgängig die Kodierung "charset=ISO-8859-1" gewählt und die Datenbanken sind nach "latin-german1" umgestellt(was ist eigentlich der Unterschied zu german2?).
Mein Hauptproblem ist also, dass Umlaute und auch andere Sonderzeichen wie das scharfe S (ß) in der Datenbank falsch gespeichert werden und ich damit auch schädlichen HTML-Code nicht verhindern kann(da etwa htmlentities nicht richtig funtioniert)!

Welchen Unterschied macht die Charset-Definition eigentlich bei....
  • ...der META-Tag-Definition
  • ...dem Javascript-Befehl "setRequestHeader"
  • ...dem PHP-Befehl: "header()"
  • ...der Definition in Dateien (z.B. xyz.php) des Charsets beim Speichern

Man findet so schwer irgendwelche zusammenfassenden Informationen, was man als Webdesigner zu beachten hat und welche Charset-Definition jetzt eigentlich gilt. Ich hab längere Zeit gesucht und bitte euch jetzt um Hilfe, da ihr einfach das kompakte Know-How habt.

Vielen Dank also schonmal für eure Zeit und eure Mühen!

Adam
 
Hi Sven,

vielen Dank!

Oh Gott, bin ich der Grund für den FAQ-Eintrag? *schäm*

Aber vielen Dank. Werde deine Checkliste demnächst durcharbeiten, um meinem Fehler auf die Spur zu kommen.

Ziemlich verwirrend das ganze. Ich hab natürlich das Problem, dass ich mich nicht auf UTF sondern ISO festgelegt habe und ich befürchte, dass ich nochmal sämtliche Umlaute irgendwie ändern muss(was unmöglich ist). Aber wie gesagt, hab das FAQ vorerst nur überflogen.

Natürlich bin ich auch Lösungsansätze, die direkt mein Problem betreffen, nicht abgeneigt. Doch vorerst kann ich diesen Beitrag mal als "erledigt" markieren.

Danke! Beste Grüße
Adam
 
Hi Sven,

ha, nochmal knapp entkommen :)

Nunja. Schon allein an zwei Dingen erkenne ich mein Problem:

1. PHPmyAdmin:
Wenn ich mir den Datensatz in PHPmyAdmin ansehe, kann ich bereits die Fehlformatierung sehen. Ich habe hier einen Screenshot angehängt, wie Bilderkommentare in die Datenbank eingetragen werden: Charset_Error.jpg

2. Resultat des MySQL-Datensatzes
Wenn ich mir im PHP-Skript das Resultat der Datenbank hernehme und dieses versuche mit dem Befehl "htmlentities()" zu kodieren, dann liefert mir PHP den entsprechend "escapten" (z.B. Ã) HTML-Code

Das sind für mich die beiden Anzeichen, durch die ich gemerkt hab, dass irgendetwas nicht stimmt, aber vor allem verhindert dies die Problemlösung -.-

Danke, dass du dir da nochmal Zeit nimmst :)
Es würde mich freuen, wenn ich kein Problem hätte... ...aber das wäre wohl zu schön ;)

Adam
 
Ich würde mal denken, dass da Latin1 nicht als Verbindungs-Datensatz genutzt wird, sondern UTF-8

Die Lösung wäre wie in den FAQ beschrieben :

Code:
SET NAMES latin1

Möglichwerweise könnte dies aber ein Chaos mit neuen Datensätzen bringen, dann probiere folgendes:
Code:
SET character_set_results = latin1;

...das sorgt dafür, dass der DB-Server in Latin1 antwortet. Der Rest erfolgt wie bisher, es hat also keine Auswirkungen auf die Datenbank ansich.
 
Danke Sven für deine schnelle Hilfe

Genau an den Lösungsansatz mit "SET" habe ich als erstes gedacht, als ich mir dein FAQ angesehen habe. Wenn du das jetzt noch als Lösung für mein Problem siehst, werde ich das wohl als erstes ausprobieren.

Die Kollation der Tabelle ist von anfang an auf "latin1-german1-ci" gesetzt. Mich würde daher interessieren, was du mit "Verbindungs-Datensatz" meinst?

Dein FAQ hilft mir sehr gut die Eigenheiten des Charsets zu verstehen... ...trotzdem ist bei mir immer noch die Unklarheit, warum das PHP-Skript bzw. AJAX Umlaute dennoch in dieser komischen Form in die Datenbank einträgt.

Nunja, wie gesagt, ich muss die FAQ selber nochmal durchprobieren. Außerdem möchte ich dich nicht weiter mit meinem Problem nerven.

Herzlichen Dank und beste Grüße:
Adam
 
Ooops, ich meinte natürlich Verbindungs-Zeichensatz :)

Also wenn der nicht auf Latin1 steht, dann antwortet der Server mit einem anderen Zeichensatz.

Da geht dann bspw. das in den FAQ erwähnte Problem mit den String-Funktionen los, denn auch htmlentities() geht standardmässig davon aus, dass es einen Latin1-String verarbeitet.
Du kannst da also entweder den DB-Server veranlassen, in Latin1 zu antworten, oder aber teilst htmlentities() über den 3.Parameter den Zeichensatz mit, in dem der Server antwortet.
 

Neue Beiträge

Zurück