Hallo!
Ich arbeite an einer Intranet-Seite und habe gehörige Probleme mit einigen wenigen Sonderzeichen (z.B. Gedankenstrich - auf 150 bei Latin1, typografische Anführungszeichen - z.B. auf 147 bei Latin 1).
Die meisten Sonderzeichen (Umlaute usw.) machen allerdings überhaupt kein Problem.
Im Browser wird per JavaScript ein HTTP-Request (POST) erzeugt und die Daten gehen an den Server (also nicht über ein Formular!). Zuvor werden Sie per escape() in Form gebracht. Hatte an dieser Stelle zuvor schon encodeURIComponent(), aber dann gehen nicht einmal die Umlaute.
Jedenfalls greift ein Perl-Skript auf die Daten über das CGI-Objekt zu und speichert sie in einer mySQL-Tabelle.
Für den Gedankenstrich landet E2 80 93 hexadezimal in der DB. Die escape-Methode wandelt ihn in %u2013 vor dem Versenden um, aber das macht keinen Unterschied zu encodeURIComponent, weil dort wird es gleich als %E2%80%93 maskiert. In der Datenbank landen jedenfalls immer die entsprechenden Zeichen (in Latin1 –).
Bei Umlauten hatte ich wie gesagt mit encodeURIComponent Probleme. Ö wird vor dem Versenden als %C3%96 maskiert (ich nehme an UTF16?) und so landen 2 Byte in der DB - entsprechend wird daraus 'Ö'. Mit escape() wird es als %D6 kodiert, was hexadezimal eben Ö in Latin1 ist.
Mein Verdacht: Kann es sein, dass das CGI-Objekt hier diese wie auch immer anders gearteten und maskierten Zeichen nicht korrekt zurückumwandelt?
Jedenfalls protokolliere ich alle Schreibzugriffe in die Tabelle und wenn ich das Logfile öffne (Midnight-Commander) sind die Zeichen im UPDATE-Query korrekt.
Immerhin ist es auch SUSE 9.1, wo meines Wissens im System defaultmäßig UTF8 zum Einsatz kommt.
Ich blick da irgendwie nicht durch.
danke für Hinweise
Sven