Sven Rautenberg: Mal wieder Zeichensätze

Beitrag lesen

Moin!

»» Deshalb: Encoding-Monokultur, nicht wild wechseln oder umcodieren. Dann geht am wenigsten kaputt.

Das würde ich noch einmal unterstreichen. Wobei deine Konstruktion etwas wild ist wegen des AJAX.

OK, ich versuche neu anzufangen, die Maskierungen im xml
entfernt, "<?xml version="1.0" encoding="UTF-8"?>" in der
ersten Zeile eingefügt und es als utf-8 kodiert abgespeichert.

Das ist ok.

Soweit sogut, wenn die xml nicht etwa aus dem cache geholt
wird, stellt der flashplayer im Frontend (Darin ist UTF-8
als Zeichensatz angegeben) alle Zeichen richtig dar. OK

Und hat Erfolg.

Im Backend, wo der Videoplayer auch angezeigt wird, werden
die Sonderzeichen im XML von Flash auch richtig dargestellt.
Die selben Daten durch PHP:simpleXML geparsed und auf der
(nicht UTF-8) Seite in das JS-Array geschrieben und dann
in Input-Felder geschrieben, werden in diesen mit kaputten
Sonderzeichen ausgegeben. Richtig stellen kann ich das,
indem ich vor der Ausgabe PHP:utf8_decode darauf anwende.

Das dürfte in dem Kontext richtig sein, oder ?

So ist es.

Und danach wird es interessant:

Ich rufe durch Abschicken des (POST) Forms ein PHP-Script
auf, dass eine neue Datei (UTF-8-encodiert) anlegen und
die Daten aus POST UTF-8-encodiert dort hineinschreiben
soll.

Die Daten, die aus dem Formular kommen, sind ISO-8859-1...

Das POST-Array vor dem Schreiben mit utf8_encode umzuwandeln
hat geholfen. Das funktioniert also scheinbar.

...weswegen das zwingend notwendig ist, sofern das XML in UTF-8 sein soll.

Jetzt gibt es aber noch einen neuen Fallstrick:

Ich lese das XML im Backend nicht direkt ein, sondert kopiere
es vorher als temp.xml und lese dann das ein. Folgender
Hintergrund:

Beim Abschicken des Formulars wird ein PHP-Skript aufgerufen,
dass das Original.xml mit den Werten aus den Formularfeldern
überschreibt. Zusätzlich habe ich eine Funktionalität gebaut,
die diese Daten nicht durch Abschicken des Formulars, sondern
über einen Ajax.Request an das selbe Skript schickt, dass dann
aber nicht das Original.xml, sondern dass temp.xml schreibt.
So lassen sich die Eingaben testen.

Der einzige Unterschied, den ich mir zwischen dem Abschicken des
Formulars und dem Ajax.Request vorstellen kann, ist, dass der
Absender ein Andrer ist.

Alles, was in AJAX läuft, ist zwingend UTF-8-codiert. Das gilt sowohl für Requests, als auch für Responses. Man kann versuchen, das Encoding zu beeinflussen, wird dabei aber derartig eklige Krücken sowie böse Browserbugs entdecken, dass es kein Spaß wird, gegen UTF-8 anzuarbeiten.

Deshalb ist es vom Prinzip her doof, dass du einerseite ein ISO-8859-1-codiertes HTML-Formular verarbeitest, andererseits einen UTF-8-codierten AJAX-Request. Das erfordert eine Fallunterscheidung im Code, und führt zu der etwas unschönen Eigenschaft, dass der AJAX-Request via UTF-8 Zeichen senden kann, die im UTF-8-XML auch unterzubringen und vom Flash auslesbar sind, welche aber beim ISO-Formular nicht darstellbar sind und deshalb verloren gehen. Um zumindest den ISO-Darstellungseffekt auch bei AJAX zu haben, musst du den empfangenen String also einmal von UTF-8 nach ISO umcodieren, und dann wieder nach UTF-8 zurückwandeln.

PS: Das Eurozeichen gibt's übrigens in ISO-8859-1 nicht - nur für den Fall, dass du es vermisst.

- Sven Rautenberg