2010-12-30 4 views
0

Ich lese Joel's article about character sets und so nehme ich seinen Rat, UTF-8 auf meiner Webseite und in meiner Datenbank zu verwenden. Was ich nicht verstehen kann ist, was mit Benutzereingaben zu tun ist. Wie Joel sagt: "Es macht keinen Sinn, eine Zeichenkette zu haben, ohne zu wissen, welche Kodierung verwendet wird." Aber woher weiß ich, welche Kodierung die Benutzereingabekette verwendet? Wenn ichWoher wissen Sie, welche Kodierung der Benutzer in den Browser eingibt?

<input type="text" name="atextfield" >

auf meiner Seite habe, wie kann ich wissen, welche Codierung Ich bin von dem Benutzer zu bekommen? Was passiert, wenn der Benutzer ein spezielles ASCII-Symbol wie ♣ oder ™ oder etwas anderes eingibt? Kann ich irgendwie feststellen, dass Benutzereingaben in UTF-8 etwas nicht erkannt haben? Gibt es einen Standard für solche Dinge?

+1

ASCII hat keine speziellen Symbole wie ♣ oder ™. Es hat nur 128 Zeichen, von denen einige Steuerzeichen sind. Es ist UTF-8, das diese Symbole hat. – hippietrail

Antwort

1

Überprüfen Sie die HTTP headers, um die Zeichencodierung zu ermitteln.

1

Wenn Ihre Webseite UTF-8 verwendet, wird der Browser für Sie in UTF-8 konvertiert. Also, auch die Sonderzeichen werden in ASCII als UTF-8 übergeben.

Sie wissen jedoch nie, juckende Hand von einem Benutzer, der die Seitencodierung auf ISO-8859- * zurückschalten.

Sie können auf mb_detect_encoding verwenden, ist aber nicht 100% kugelsicher.

/* Detect character encoding with current detect_order */ 
echo mb_detect_encoding($str); 

/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */ 
echo mb_detect_encoding($str, "auto"); 

/* Specify encoding_list character encoding by comma separated list */ 
echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win"); 

/* Use array to specify encoding_list */ 
$ary[] = "ASCII"; 
$ary[] = "JIS"; 
$ary[] = "EUC-JP"; 
echo mb_detect_encoding($str, $ary); 
1

Versuchen Sie nicht, alle Benutzer eingegeben Text in UTF-8 in Ihrer Anwendung zu erkennen. Sie können alles tun, was Sie können, indem Sie Ihren Webserver so konfigurieren, dass UTF-8-Seiten und UTF-8-Header gesendet werden, Ihre Anwendung für die Verarbeitung aller Texte in UTF-8 konfigurieren, Ihr Dateisystem (falls erforderlich) für Textdateien anpassen UTF-8, konfigurieren Sie Ihre Datenbank, aber Sie haben einfach keine echte Kontrolle auf der Benutzerseite. Sie können den richtigen Zeichencodierung in Ihren HTML-Formulare vorschlagen, wie die folgenden, aber es ist nicht wirklich durchsetzbar auf der Benutzerseite:

<form action="/index.php" method="post" accept-charset="UTF-8"></form> 

Es sei denn, die Codierung der Benutzereingabe Erfassen der ganze Zweck der Anwendung ist, ist es ein Idiot, um es zu versuchen. Angenommen, die Codierung ist falsch und konvertiert sie in UTF-8 in Ihrer App. Genauso wie Sie davon ausgehen sollten, dass Ihre Benutzereingaben bösartig sind, und bereinigen Sie sie, bevor Sie versuchen, sie in Ihre Datenbank einzufügen.

In den meisten Sprachen, in denen UTF-8 korrekt implementiert ist, werden ASCII-Zeichen die Konvertierung überleben, also machen Sie sich auch keine Gedanken darüber.

+0

"Nehmen Sie an, dass die Codierung falsch ist, und konvertieren Sie sie in Ihrer App in UTF-8." Aber Sie können nicht von "falsch" in UTF-8 konvertieren, müssen Sie von einer anderen spezifischen Codierung in UTF-8 konvertieren. Wenn Ihre Seite in UTF-8 bereitgestellt wird und Sie UTF-8 nicht zurückbekommen, können Sie wahrscheinlich nicht viel tun, wenn Sie keine vollständige Kodierungsprüfung durchführen möchten, und selbst diese sind nicht zu 100% garantiert. – hippietrail

+2

Ich verstehe nicht, welches Problem Sie mit meinem Kommentar hatten, da Sie im Grunde sagen, was ich gesagt habe. Sie sind richtig, dass Sie nicht mit absoluter Sicherheit wissen können, welche Kodierung eine zufällige Benutzereingabe sein wird. Aber Kodierung ist wirklich die geringste Ihrer Probleme, wenn Sie Benutzereingaben in Ihre Datenbank einfügen. Alles, was Sie wirklich tun können, ist, es in UTF-8 zu konvertieren und auf das Beste zu hoffen, da Sie über potentiell SQL-Injection-Code verfügen und andere, wichtigere Dinge tun müssen. Da dies nicht 1996 ist, unterstützen die meisten Browser und Betriebssysteme UTF-8-Kodierung, so dass dies alles akademisch ist. –

+0

Also muss ich nur mit der Tatsache leben, dass es verstümmelten Text geben wird, wenn jemand etwas einreicht, das nicht UTF-8 ist? – CuppaJoe

Verwandte Themen