Escapezeichen in der URL

203

Ich versuche, eine GET-Nachricht zu senden, die Zeichenfolgen mit kaufmännischem Und enthält, und kann nicht herausfinden, wie das kaufmännische Und in der URL umgangen werden kann.

Beispiel:

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

Ich habe auch versucht:

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

Ich verwende URLs manuell, daher benötige ich nur die richtigen Zeichen.

Ich kann keine Bibliotheken benutzen. Wie geht das?

Tomermes
quelle

Antworten:

350

Sie müssen prozentual codiert sein:

> encodeURIComponent('&')
"%26"

In Ihrem Fall würde die URL also folgendermaßen aussehen:

http://www.mysite.com?candy_name=M%26M
Mixer
quelle
2
: -% 26 arbeitet nicht für mich. Gibt es eine andere Lösung?
Sanjiv
2
Wenn ich & zu% 26 ersetze, zeigt es immer noch den gleichen FehlerA potentially dangerous Request.Path value was detected from the client (&).
Sanjiv
4
@ Sanjiv: Das ist ein Problem mit Ihrem Code, nicht die prozentuale Codierung. Stelle eine Frage.
Blender
2
@Sanjiv Stellen Sie sicher, dass Sie zuerst "&" durch "% 26" ersetzen. Siehe Code ::: NSString * message = @ "Hallo Jack & Jill"; message = [message stringByReplacingOccurrencesOfString: @ "&" withString: @ "% 26"]; message = [message stringByAppendingString: @ ""]; message = [message stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Nirav
40

Dies gilt nicht nur für das kaufmännische Und in URLs, sondern für alle reservierten Zeichen . Einige davon sind:

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

Die Idee ist die gleiche wie beim Codieren von & in einem HTML-Dokument, aber der Kontext wurde geändert, um sich innerhalb des URI zu befinden, zusätzlich dazu, dass er sich innerhalb des HTML-Dokuments befindet. Die prozentuale Codierung verhindert also Probleme beim Parsen in beiden Kontexten.

Der Ort, an dem dies sehr nützlich ist, ist, wenn Sie eine URL in eine andere URL einfügen müssen. Wenn Sie beispielsweise einen Status auf Twitter veröffentlichen möchten:

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

Mein Tweet enthält viele reservierte Zeichen ?'():/, daher habe ich den gesamten Wert des statusURL-Parameters codiert . Dies ist auch hilfreich, wenn Sie mailto:Links verwenden, die einen Nachrichtentext oder Betreff haben, da Sie die Parameter bodyund codieren müssen, um subjectZeilenumbrüche, kaufmännisches Und usw. intakt zu halten.

Wenn ein Zeichen aus dem reservierten Satz (ein "reserviertes Zeichen") in einem bestimmten Kontext eine besondere Bedeutung (ein "reservierter Zweck") hat und ein URI-Schema besagt, dass dieses Zeichen für einen anderen Zweck verwendet werden muss, dann das Zeichen muss prozentual codiert sein. Bei der prozentualen Codierung eines reservierten Zeichens wird das Zeichen in ASCII in seinen entsprechenden Bytewert konvertiert und dieser Wert dann als ein Paar hexadezimaler Ziffern dargestellt. Die Ziffern, denen ein Prozentzeichen ("%") vorangestellt ist, das als Escapezeichen verwendet wird, werden dann in der URI anstelle des reservierten Zeichens verwendet. (Für ein Nicht-ASCII-Zeichen wird es normalerweise in UTF-8 in seine Bytesequenz konvertiert, und dann wird jeder Bytewert wie oben dargestellt.) Das reservierte Zeichen "/", wenn es beispielsweise im "Pfad" verwendet wird. Komponente eines URI hat die besondere Bedeutung, ein Trennzeichen zwischen Pfadsegmenten zu sein. Wenn sich "/" gemäß einem bestimmten URI-Schema in einem Pfadsegment befinden muss, 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

Alex W.
quelle
4
In der obigen Liste ! ' ( ) *sind keine URL-codiert mit encodeURIComponent.
Amil Waduwawara
Es gibt eine PHP-Funktion Urlencode, die dieses Problem löst: Verwendung $ entkommenDateiname = Urlencode ($ Dateiname);
Jeremy Young
3

Sie können das% -Zeichen verwenden, um Zeichen zu maskieren, die in URLs nicht zulässig sind. Siehe [RFC 1738].

Eine Tabelle mit ASCII-Werten unter http://www.asciitable.com/ .

Sie können sehen, dass &26 hexadezimal ist - Sie benötigen also M% 26M.

Peter Hull
quelle
2

Dies kann hilfreich sein, wenn jemand es in PHP möchte

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);
Mohamed Ramadan
quelle
1

Ich möchte einen kleinen Kommentar zur Blender-Lösung hinzufügen.

Sie können Folgendes tun:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

Das gibt aus:

http://example.com?candy_name=M%26M

Das Tolle daran ist, dass es nicht nur für &, sondern für jeden besonderen Charakter funktioniert.

Zum Beispiel:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

Ausgänge:

"http://example.com?candy_name=M%26M%3F%3E%3C"
Antonio
quelle
0

Sie können Ihre Argumente lieber mit dieser Funktion encodeURIComponent übergeben, damit Sie sich keine Gedanken über die Übergabe von Sonderzeichen machen müssen.

data: "param1=getAccNos&param2="+encodeURIComponent('Dolce & Gabbana') OR
var someValue = 'Dolce & Gabbana';
data : "param1=getAccNos&param2="+encodeURIComponent(someValue)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

nikhilmeth
quelle