Sven Rautenberg: & (PHP) Feldwert: Resource id #2

Beitrag lesen

Moin!

if(!isUTF8($_POST['link'])) {
  $link = utf8_encode($_POST['link']);
}
else {
  $link = $_POST['link'];
}
Das sieht irgendwie schrill aus. Weißt du nicht, ob du UTF-8 kriegst, dann solltest du das lieber exakt definieren - in deinem Formular.

Das habe ich getan. Die erste Zeile im PHP-Script lautet [code lang=PHP]<?php header("Content-type: text/html; charset=utf-8"); ?>

  
Man kann auch noch accept-charset als Attribut im <form> angeben. Alle drei Angaben zusammen sollten jeden noch so widerspenstigen Browser davon überzeugen, dass er sich tatsächlich mit UTF-8 beschäftigen sollte. :)  
  

> > Alles andere ist ziemlich schwachsinnig. utf8\_encode wandelt von ISO-8859-1 nach UTF-8 - was natürlich nur richtig funktioniert, wenn du wirklich ISO-8859-1 erhälst, ansonsten zerstört es dir so oder so den Textinhalt.  
>   
> Hm, das Problem ist, wie ich den Zeichensatz herausbekomme. In [http://dev.mysql.com/tech-resources/articles/4.1/unicode.html](http://dev.mysql.com/tech-resources/articles/4.1/unicode.html) ist das nur für windows-1252 beschrieben, ich nahm fälschlicherweise an, dass utf8\_encode() die Umwandlung zu UTF-8 unabhängig vom Ausgangszeichensatz vornimmt.  
  
Du kannst den Zeichensatz nicht herausbekommen, wenn der Browser dir nicht sagt, welchen Zeichensatz er verwendet.  
  
Und leider sagen außer dem Opera-Browser die häufig verwendeten Browser IE und Mozilla/Firefox (andere nicht getestet) in ihrem POST-Request eben nur, dass die gesendeten Daten zu den Formularfeldern gehören, aber nicht, in welchem Zeichensatz sie gesendet wurden.  
  
Es gibt also keine Möglichkeit, den benutzten Zeichensatz von hereinkommenden Formularen zu \_erkennen\_, bestenfalls kann man \_raten\_.  
  
Eine etwas ausführlichere Diskussion zu dem Thema gibts im Bugtracker des Mozilla auf englisch: <https://bugzilla.mozilla.org/show_bug.cgi?id=228779>. Bemerkenswert: Die mangelhafte Behandlung des Formular-Encodings durch Mozilla wurde schon 2003 bemängelt, ist aber immer noch nicht abschließend erledigt.  
  
Deshalb: Die einzige Möglichkeit, von Browsern egal welcher Bauart vernünftige Daten zu erhalten, ist die Verwendung von UTF-8 als \_einziger\_ Zeichencodierung (zumindest im Dokument, welches das Formular enthält - das dann in der Verarbeitung aber z.B. in ISO-8859-1 zu wandelt scheint mir absolut blödsinnig, weil man damit effektiv Zeichen verliert, die durchaus sinnvoll und häufiger sind, wie beispielsweise das Eurozeichen oder typographische Zeichen wie "deutsche Anführungszeichen" oder echte Binde- und Trennstriche anstelle des Minuszeichens).  
  
Wenn du eine Funktion isUTF8() hast, dann sollte die einzig prüfen, ob die Bytefolge des Strings valides UTF-8 ist. Im Fehlerfall kannst du dann allerdings nichts weiter tun als die fehlerhaften Bytes bzw. Zeichen zu entfernen.  
  

> PS: <flame>Mit Perl wäre das nicht passiert!</flame>  
  
Aber sicher doch! ;)  
  
 - Sven Rautenberg

-- 
My sssignature, my preciousssss!