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.

0voto

Your Common Sense Punkte 154708

Die Antwort ist einfach: String wird immer codiert. Wie im HTTP-Standard angegeben.
Und was Firefox anzeigt - spielt keine Rolle.

Außerdem decodiert PHP die Abfrage automatisch, daher ist kein Decodieren erforderlich.

Beachten Sie, dass '%D2%F0%E0%EB%E8%E2%E0%EB%E8' eine Einzelbyte-Codierung ist, daher haben Sie Ihre Seite wahrscheinlich in 1251. Zumindest sagt das der HTTP-Header dem Browser.
Während AJAX immer utf-8 verwendet.

Sie müssen also entweder nur eine Codierung (utf-8) für Ihre Seiten verwenden oder AJAX-Aufrufe von normalen unterscheiden.

Was das Fragment betrifft - verwenden Sie keinen Fragmentwert, um ihn an den Server zu senden. Legen Sie eine JS-Variable an und verwenden Sie sie dann zweimal - um ein Fragment zu setzen und um es an den Server zu senden using JSON.

0voto

bcosca Punkte 17013

RFC 1738 besagt, dass nur alphanumerische Zeichen, die Sonderzeichen $-_.+!*'()," und reservierte Zeichen ;/?:@=& innerhalb einer URL uncodiert sind. Alles andere wird vom HTTP-Client, d. h. dem Webbrowser, codiert. Sie können rawurldecode() verwenden, unabhängig davon, ob PHP die Abfrage automatisch decodiert. Es besteht keine Gefahr bei der doppelten Dekodierung.

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