2009-09-19 12 views

Antwort

15

Um es kurz zu machen: Sie wissen nicht wirklich über die Kodierung (Zeichensatz) für die Variablen, die über GET oder POST an Ihr PHP-Skript übergeben werden (besonders GET ist hier ein Problem). Per Konvention bildet der POST die serverseitige Ressource, die im action -Attribut angegeben ist, unter Verwendung der Seitencodierung, die über einen http-equiv -meta-Tag (charset -Meta-Tag in HTML5) oder über einen HTTP-Header spezifiziert werden kann. Alternativ berücksichtigen einige Browser auch das accept-charset -Attribut auf dem Formular bei der Auswahl der richtigen Codierung.

Die Codierung der GET-Parameter und der URL selbst hängt von den Browser-Einstellungen ab und kann daher vom Benutzer gesteuert werden. Sie sollten sich nicht auf eine bestimmte Kodierung verlassen.

Im Allgemeinen werden Sie die meisten codierungsbezogenen Probleme umgehen, indem Sie konsequent UTF-8 für alles verwenden und die korrekte Codierung im HTTP-Header angeben (Content-Type: text/html; charset=UTF-8). Dies ergibt die korrekte Codierung (UTF-8) die Variablen, die an Ihre Zeichenfolge übergeben werden (wir sprechen nicht über Rouge-Skripts, die absichtlich versuchen, sich mit der Codierung zu befassen, um Angriffsvektoren in Ihr Skript zu ermöglichen). Sie sollten sich auch nicht auf Nicht-ASCII-Zeichen in Ihren GET-Parametern oder in der URL verlassen (das ist auch ein Grund, warum SEO-freundliche Links diese Zeichen entfernen oder ersetzen). Wenn Sie sichergestellt haben, dass UTF-8 der einzige zulässige Zeichensatz ist, können Sie mb_strlen($string, 'UTF-8') verwenden, um beispielsweise die Länge einer Variablen zu überprüfen.

EDIT: (hinzugefügt einige Links)

Einige Dinge für Sie zu lesen:

+0

Die Codierung der URL hängt auch vom verweisenden Dokument ab. Nur wenn die URL direkt in der Adressleiste eingegeben wird, sind die Einstellungen des Browsers entscheidend. – Gumbo

5

Verwenden Sie mb_internal_encoding um zu wissen, welche Kodierung gerade eingestellt ist. Wenn Sie ein Protokoll mit einer anderen Kodierung verwenden, verwenden Sie besser mb_strlen. Normalerweise

Prost

1

Sie haben die Kontrolle über die Zeichencodierung, da Sie die $ _REQUEST aus dem HTML erstellen Sie an den Client senden.

IE: Es wird von einer Seite generiert, die Sie von PHP gesendet haben.

Daher sollten Sie die Codierung nicht erkennen müssen.

Die Verwendung der mb_functions erfordert die Aktivierung der Multibyte-Erweiterung - wenn Sie also Code verteilen, müssen Sie sich bewusst sein, dass nicht jeder ihn haben wird.

header('Content-Type: text/html; charset=UTF-8'); 

OR in HTML:

<meta charset="utf-8"> 

http://www.w3.org/International/O-charset

Edit: PHP6 utf-8-Unterstützung hat, nicht PHP5.

+0

„die String-Funktionen sind UTF-8 kompatibel“ . bedeutet es, dass strlen in php5 die korrekte Länge von utf8 string zurückgibt? – lovespring

+0

"Ab PHP5 sind die Zeichenfolgenfunktionen UTF-8-kompatibel." Das ist definitiv nicht korrekt. Die internen String-Funktionen von PHP arbeiten alle auf Byte-Ebene, was bedeutet, dass sie nicht mit Multi-Byte-Zeichen umgehen können (gültig für PHP <6). Alle internen Funktionen, bei denen die Länge eines Zeichens (in Bytes) wichtig für die Operation ist, sind fehleranfällig, wenn mit diesen Zeichensätzen gearbeitet wird. Die erwähnte Multibyte-Erweiterung (mb_ *) ist überladbar, aber ich rate dringend davon ab. –

+0

Ich war weit weg, PHP5 hat keine Multibyte-Unterstützung. – bucabay