2013-05-18 10 views
119

Ich versuche, eine GET-Nachricht zu senden, die Zeichenfolgen mit Et-Zeichen enthält und nicht herausfinden kann, wie das Et-Zeichen in der URL zu entkommen.Escape-Ampersand in URL

Beispiel:

http://www.example.com?candy_name=M&M 
result => candy_name = M 

ich auch versucht:

http://www.example.com?candy_name=M\&M 
result => candy_name = M\\ 

ich Urls bin mit manuell so ich brauche nur die richtigen Zeichen.

Ich kann keine Bibliotheken verwenden. Wie kann es gemacht werden?

Antwort

219

Sie müssen in der Prozent-codiert:

> encodeURIComponent('&') 
"%26" 

Also in Ihrem Fall würde die URL wie folgt aussehen:

http://www.mysite.com?candy_name=M%26M 
+1

: -% 26 funktioniert nicht für mich. Gibt es eine andere Lösung? – Sanjiv

+0

@Sanjiv: Was meinst du mit "nicht funktioniert"? – Blender

+1

Wenn ich &% 26 ersetze, wird immer noch der gleiche Fehler angezeigt - 'Ein potentiell gefährlicher Request.Path-Wert wurde vom Client (&) gefunden.' – Sanjiv

5

mit http://www.mysite.com?candy_name=M%26M Versuchen.

Siehe auch diese reference und einige weitere Informationen über wikipedia.

2

Sie können das Zeichen% verwenden, um Zeichen zu "entkommen", die in URLs nicht zulässig sind. Siehe RFC1738.

Werte Eine Tabelle von ascii ist hier: http://www.asciitable.com/

Sie sehen & 26 in hex ist - so, was Sie brauchen M% 26M ist

27

Dies gilt nicht gelten nur zum Ampersand in URLs , aber für alle reserved characters. Einige davon sind:

# $ & + ,/: ; = ? @ [ ] 

Die Idee ist das gleiche wie ein & in einem HTML-Dokument codiert, aber der Kontext geändert hat innerhalb der URI, zusätzlich zu sein, um innerhalb des HTML-Dokuments zu sein. Die prozentuale Codierung verhindert daher Probleme beim Parsen in beiden Kontexten.

Der Ort, wo dies sehr nützlich ist, wenn Sie eine URL innerhalb einer anderen URL setzen müssen. Zum Beispiel, wenn Sie einen Status auf Twitter stellen:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com) 

Es gibt viele reservierten Zeichen in meinem Tweet, nämlich ?'():/, so codierte ich den ganzen Wert der status URL-Parameter. Dies ist auch hilfreich bei der Verwendung von mailto: Links, die einen Nachrichtentext oder Betreff haben, weil Sie die body und subject Parameter codieren müssen, um Zeilenumbrüche, Et-Zeichen usw. intakt zu halten.

Wenn ein Zeichen aus dem reservierten Satz (ein „reserviert Zeichen“) hat besondere Bedeutung (ein „reservierter Zweck“) in einem bestimmten Kontext und ein URI Schema sagt, dass es notwendig ist, dieses Zeichen zu verwenden für einige andere Zweck, dann muss das Zeichen Prozent codiert werden.Percent-encoding Bei einem reservierten Zeichen wird das Zeichen in seinen entsprechenden Byte-Wert in ASCII konvertiert und dann als ein Paar Hexadezimalziffern dargestellt. Die Ziffern, denen ein Prozentzeichen ("%") vorangestellt ist und das als Escape-Zeichen verwendet wird, werden dann anstelle des reservierten Zeichens im URI verwendet. (Für ein Nicht-ASCII-Zeichen wird typischerweise in seine Byte-Sequenz in UTF-8 konvertiert, und dann wird jedes Byte Wert wie oben dargestellt.) Das reservierte Zeichen "/", beispielsweise für Pfad "Komponente eines URI, hat die spezielle Bedeutung, ein Trennzeichen zwischen Pfadsegmenten zu sein. Wenn gemäß einem gegebenen URI-Schema "/" in einem Pfadsegment sein muss, dann müssen die drei Zeichen "% 2F" oder "% 2f" im Segment anstelle eines rohen "/" verwendet werden.

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

+2

Unter der obigen Liste '! '() * 'sind nicht URL-codiert mit' encodeURIComponent'. –

0
// this may help if someone want by php 
$variable ="candy_name=M&M"; 
$variable = str_replace("&","%26",$variable);