5 Stimmen

PHP UTF-codierte URL-Zeichenkette

Wenn ich in Firefox (in der Adresszeile) eine URL wie http://www.example.com/?query= eingebe, wird sie automatisch codiert zu http://www.example.com/?query=%D2%F0%E0%EB%E8%E2%E0%EB%E8.

Aber eine URL wie http://www.example.com/#ajax_call?query= wird nicht konvertiert.

Andere Browser wie IE8 konvertieren die Abfrage überhaupt nicht.

Die Frage ist: Wie kann man (in PHP) erkennen, ob die Abfrage codiert ist? Wie decodiert man sie?

Ich habe es versucht:

  1. $str = iconv('cp1251', 'utf-8', urldecode($str) );

  2. $str = utf8_decode(urldecode($str));

  3. $str = (urldecode($str));

  4. viele Funktionen von http://php.net/manual/en/function.urldecode.php Nichts funktioniert.

Test:

$str = $_GET['str'];

d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == urldecode('%D2%F0%E0%EB%E8%E2%E0%EB%E8'));

d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == $str);

d('' == $str);

d(urldecode($str));

d(utf8_decode(urldecode($str)));

!!! d('%D2%F0%E0%EB%E8%E2%E0%EB%E8' == urlencode($str)); !!!

Rückgabe:

[false] [false] [false] ???? [true]

Eine mögliche Lösung: http://www.example.com// - die Abfrage als Teil der URL senden und mit mod_rewrite parsen.

7voto

Andrew Moore Punkte 90339

Es wird nicht umgewandelt, da der query-Teil der URL nach dem Fragment nicht gültig ist.

RFC 3986 definiert eine URI als zusammengesetzt aus den folgenden Teilen:

     foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment

Die Reihenfolge kann nicht geändert werden. Daher,

URL1: http://www.example.com/?query=#ajax_call

wird richtig verarbeitet, während

URL2: http://www.example.com/#ajax_call?query=

nicht. Wenn wir uns URL2 anschauen, behandelt der IE tatsächlich die URL richtig, indem er das Fragment als #ajax_call?query= ohne Abfrage erkennt. Das Fragment ist immer zuletzt und wird niemals an den Server gesendet.

Der IE wird den Abfragebestandteil von URL1 ordnungsgemäß encodieren, da er ihn als Abfrage erkennt.

Was das Decodieren in PHP betrifft, wird %D2 und ähnliches automatisch im $_GET['query']-Variablen decodiert. Der Grund, warum die $_GET-Variable nicht ordnungsgemäß gefüllt war, lag daran, dass es in URL2 keine Abfrage gemäß dem Standard gab.

Außerdem, noch eines... wenn du '' == $_GET['query'] machst, wird dies nur dann wahr sein, wenn dein PHP-Skript selbst in UTF-8 encodiert ist. Dein Texteditor sollte dir sagen können, welche Codierung deine Datei hat.

3voto

mvds Punkte 44160
rawurldecode($_GET['query']);

aber das sollte eigentlich bereits von PHP erledigt worden sein ;-)

bearbeiten du sagst "nichts funktioniert" - was versuchst du? wenn der Text nicht so angezeigt wird, wie du es möchtest, wenn du zum Beispiel echo $_GET['query']; verwendest, könnte dein Problem die Codierung sein, die du für die Seite angibst, die an den Browser zurückgesendet wird.

Füge eine Zeile ein

header("Content-Type: text/html; charset=utf-8");

und sieh, ob es hilft.

2voto

Artefacto Punkte 93200

Wie das Fragment codiert wird, ist leider browserabhängig:

Wird die Fragment-ID (Hash) durch Anwendung der vom RFC vorgeschriebenen URL-Escape-Regeln codiert?
MSIE: NEIN
Firefox: TEILWEISE
Safari: JA
Opera: NEIN
Chrome: NEIN
Android: JA

Was die Frage betrifft, welche Kodierung der Browser verwendet, um internationale (d. h. non-ASCII) Zeichen zu kodieren, bevor sie in %nn-Escape-Sequenzen umgewandelt werden, "gehen die meisten Browser damit um, indem sie standardmäßig UTF-8-Daten für alle per Hand eingegebenen Texte in der URL-Leiste senden und die Seitenkodierung für alle gefolgten Links verwenden." (gleiche Quelle).

1voto

Rin-Nas Punkte 11

Sie könnten dafür UTF8::autoconvert_request() verwenden.

Schauen Sie sich http://code.google.com/p/php5-utf8/ für weitere Informationen an.

0voto

seand Punkte 5162

URLs sind auf bestimmte ASCII-Zeichen beschränkt. Nicht-url-freundliche Zeichen sollen URL-codiert werden (die %hh-Codierung, die Sie sehen). Einige Browser könnten URLs automatisch codieren, die in der Adressleiste erscheinen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X