Moin!
some browsers (including Microsoft Internet Explorer and Apple Safari) will actually send the data encoded as Windows-1252, which extends ISO-8859-1 with some special symbols, like the euro (€) and the curly quotes (“”).
Wenn die Seite als UTF-8 ausgeliefert wird und als accept-charset im form auch UTF-8 steht, dann schicken alle nennenswert häufig auftretenden Browser auch UTF-8 an den Server zurück.
Sofern man nicht spezielle Stringoperationen plant, also z.B. nach exakt einem Buchstaben sucht, was durch die benutzte Skriptsprache in die "Suche nach exakt einem Octet" umgesetzt wird, ist es vollkommen irrelevant, ob man UTF-8 oder ISO-8859-1 verwendet. Dazu hatte ich in der Vergangenheit hier im Forum schon etliche Erklärungen geliefert.
Auch die Datenbank muß nicht zwingend UTF-8 verstehen, es reicht vollkommen aus, wenn sie in der Lage ist, 8-Bit-Texte zu speichern und wieder auszugeben. Man muß dann halt einkalkulieren, dass ein Umlaut nicht als ein Zeichen durchgeht, sondern als zwei Zeichen, und das Eurosymbol sogar als drei Zeichen.
Böse Nebeneffekte wären zum Beispiel eine unsachgemäße Anwendung der wordwrap-Funktion. Eine Begrenzung der Zeilenlänge auf 80 Zeichen wirkt sich in PHP so aus, dass z.B. nach 80 Byte eine Leerzeiche eingefügt wird. Wenn man in der Zeile aber viele UTF-8-Zeichen mit Doppelbytes hat, sind zwar 80 Byte enthalten, das Resultat sind aber z.B. nur 40 Zeichen in der Zeile. Und natürlich könnte auch ein UTF-8-Zeichen in der Mitte durchgeschnitten und damit zerstört werden.
Sortierungsmäßig hingegen ist UTF-8 extra so konzipiert, dass man auch ohne Kenntnis, dass es sich um UTF-8 handelt die Strings einfach mit einer simplen bytewertorientierten Sortierung in eine Reihenfolge bringen kann. ÄÖÜ werden genau wie bei ISO-8859-1 hinten einsortiert.
Sortieren nach Alphabet ist allerdings nur auf den ersten Blick und bei 7-Bit-ASCII-Zeichen "ganz einfach". Die deutschen Umlaute beispielsweise werden beim "richtigen" Sortieren eigentlich wie A, O und U behandelt. Und auch andere Unicode-Alphabete sind in ihrer Codefolge nicht so abgelegt, dass ein Sortieren nach den Codepoint-Werten automatisch das aufsteigende Alphabet ergibt, sondern es müssen dafür spezielle Sortier-Routinen eingesetzt werden.
Zurück zu den Browsern und "accept-charset": Man kann dort in der Tat mehrere Zeichencodierungen als erlaubt eintragen. Die Browser nehmen das dann auch tatsächlich für bare Münze und wenden die Codierung an, die gerade noch paßt - soll heißen: Wenn ISO-8859-1 und UTF-8 erlaubt sind, dann wird normaler Text (auch mit Umlauten) als ISO-8859-1 verschickt, wird aber das Eurozeichen eingetippt, schickt der Browser UTF-8.
Das ist soweit noch nicht schlimm. Das Problem ist nur: Außer Opera teilt kein einziger Browser mit, welche Codierung er denn nun gewählt hat. Und nur an den gesendeten Zeichen-Bytes kann man es auch nicht erkennen - außer diese Codierung liefert für die Nicht-UTF-8-Alternative Zeichencodes, die in UTF-8 nicht vorkommen können.
Deshalb ist es absolut keine gute Idee, im accept-charset mehr als eine Möglichkeit anzugeben, und es ist (IIRC wegen einiger älterer IEs) auch nahezu unumgänglich, die Formularseite selbst schon als UTF-8 auszuliefern.
Die deutsche Wikipedia hat im Vorfeld ihrer Umstellung auf UTF-8 (etwas, das tatsächlich unumgänglich ist, weil man nur mit einem voll unicodefähigen Zeichencodierungsschema zukunftssicher ALLE Zeichen verwalten kann) diverse Diskussionen und Feststellungen hinsichtlich der Verwendbarkeit der einzelnen Browser zum BEARBEITEN der Wikipedia-Seiten festgehalten. Die Seiten-URL finde ich jetzt spontan nicht, aber es wurde dort eben akzeptiert, dass es etliche Browser gibt, die enthaltene Unicode-Zeichen durch das Bearbeiten der Seite zerstören.
Bei Gästebüchern und Forums-Postings ist sowas allerdings halb so schlimm, weil es üblicherweise nicht vorkommt, dass beliebige Besucher die Texte vorheriger Besucher verändern. Schlimmstenfalls kommen eben die Sonderzeichen des geschriebenen Textes nicht ordentlich durch - ist dann halt Pech.
- Sven Rautenberg