Sven Rautenberg: Zeichencode in Zeichen konvertieren / Sonderzeichen in Form

Beitrag lesen

Moin!

Verwende *unbedingt* an *ausnahmslos* *jeder* Stelle *ausschließlich* UTF-Kodierung.

Darf ich - nachdem mein Beispiel eben auch nach dem Verwenden von utf8_decode() funktioniert - nach dem Warum fragen?

Das Warum ist recht simpel zu erklären: Webseiten sind im Browser IMMER Unicode. Auch in Formularfelder kann der User immer alle definierten Unicode-Zeichen eingeben. Das will man eventuell nicht (beispielsweise für Usernamen oder Dateinamen), aber die Kontrolle über die Zeicheneingabe sollte man dann definiert in seinem eigenen Skript ausüben, und nicht die diversen "Oh, ich kann das Zeichen nicht übermitteln, was mach ich jetzt?"-Korrekturen der diversen Browser aktivieren.

Denn die Browser verhalten sich in solchen Fällen sehr unterschiedlich.
Manche schicken dir einfach UTF-8, obwohl du ISO-8859-1 erwartest. Das sieht nicht schön aus, aber mit viel Aufwand könnte man diese Zeichen hinterher wieder reparieren.

Manche schicken dir echte ASCII-Fragezeichen "?" anstelle der nicht in ISO-8859-1 codierbaren Zeichen. Solche Fragezeichen erlauben keinerlei Reparatur.

Manche Browser schicken dir anstelle des Unicode-Zeichens eine numerische Zeichenreferenz: Ӓ - sowas sieht ebenfalls nicht schön aus, vor allem: Wenn du beim Wiederausgeben des Textes das Zeichen wieder siehst, hast du in Wirklichkeit eine Sicherheitslücke. Das Zeichen ließe sich allerdings ebenfalls noch reparieren.

Die Sache mit der Reparatur scheitert allerdings an dem Punkt, wo mehrere unterschiedliche Browser alle unterschiedlich kaputte Zeichen senden, und du hinterher eine Mischung diverser Zeichen reparieren müsstest, aber keine Indizien hast, welche Reparaturmethode denn korrekt wäre. Denn alle diese "kaputten" Zeichen könnten ja auch korrekt gewesen sein, weil der Benutzer die genau so schreiben wollte - beispielsweise, um in einem Forum über Codierprobleme zu diskutieren.

Du hast ein perfektes UTF-"ä" erhalten.

Das war mir anfangs nicht klar - soweit jetzt kein Problem.

Nutze es weise.

Mein Einsatz von utf8_decode ist ganz offensichtlich alles andere als weise.
Aber darf ich nach dem Grund fragen?

Du konvertierst aus dem Raum aller computerlesbarer Zeichen (irgendwas bei 200.000 Stück) in den nur in ISO-8859-1 definierten Zeichenraum (256 Zeichen). Das geht nicht ohne Verluste, und es fängt schon beim Euro-Zeichen an - denn das ist in ISO-8859-1 nicht definiert und geht dabei kaputt.

Und der eventuelle Impuls, dann doch einfach das Eurozeichen durch € zu ersetzen, bevor du dekodierst, ist auch die falsche Antwort: Mit UTF-8 musst du dir keine Gedanken machen, welche Zeichen eventuell kaputt gehen, weil einfach alle dargestellt werden können. Und das Entity-Mischmasch stört dich hinterher ganz extrem beim erneuten Anzeigen von Texten auf der Webseite, denn die müssen mit htmlspecialchars() behandelt werden, wenn sie "Text" sein sollen (und kein HTML).

- Sven Rautenberg