Wenn Sie eine Abfragezeichenfolge codieren, die an einen Webserver gesendet werden soll - wann verwenden Sie escape()
und wann verwenden Sie encodeURI()
oder encodeURIComponent()
:
Verwenden Sie Escape:
escape("% +&=");
ODER
benutze encodeURI () / encodeURIComponent ()
encodeURI("http://www.google.com?var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2")
ist nicht der typische Anwendungsfall. Dieses Beispiel wird das=
und codieren&
, was wahrscheinlich nicht beabsichtigt ist!encodeURIComponent
wird normalerweise separat nur auf den Wert in jedem Schlüsselwertpaar (dem Teil nach jedem=
) angewendet .var params = encodeURIComponent(key) + '=' + encodeURIComponent(value);
- Vielleicht kennt jemand anderes einen besseren Weg.Antworten:
Flucht()
Benutze es nicht!
escape()
ist in Abschnitt B.2.1.2 Flucht definiert und der Einführungstext von Anhang B lautet:Verhalten:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
Sonderzeichen werden mit Ausnahme von: @ * _ + - codiert. /
Die hexadezimale Form für Zeichen, deren Codeeinheitswert 0xFF oder weniger beträgt, ist eine zweistellige Escape-Sequenz :
%xx
.Für Zeichen mit einer größeren Codeeinheit wird das vierstellige Format
%uxxxx
verwendet. Dies ist in einer Abfragezeichenfolge (wie in RFC3986 definiert ) nicht zulässig :Ein Prozentzeichen ist nur zulässig, wenn direkt zwei Hexdigits folgen, Prozent gefolgt von
u
nicht.encodeURI ()
Verwenden Sie encodeURI, wenn Sie eine funktionierende URL wünschen. Rufen Sie an:
bekommen:
Rufen Sie encodeURIComponent nicht auf, da dies die URL zerstören und zurückkehren würde
encodeURIComponent ()
Verwenden Sie encodeURIComponent, wenn Sie den Wert eines URL-Parameters codieren möchten.
Dann können Sie die URL erstellen, die Sie benötigen:
Und Sie erhalten diese vollständige URL:
http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55¶m2=99
Beachten Sie, dass encodeURIComponent dem
'
Zeichen nicht entgeht . Ein häufiger Fehler besteht darin, damit HTML-Attribute zu erstellen, z. B.href='MyUrl'
die einen Injektionsfehler verursachen können. Wenn Sie HTML aus Zeichenfolgen erstellen , verwenden Sie entweder"
anstelle von'
Attributanführungszeichen oder fügen Sie eine zusätzliche Codierungsebene hinzu ('
kann als% 27 codiert werden).Weitere Informationen zu dieser Art der Codierung finden Sie unter: http://en.wikipedia.org/wiki/Percent-encoding
quelle
'
mit'
) , bevor sie in ein HTML - Dokument platziert werden.Der Unterschied zwischen
encodeURI()
undencodeURIComponent()
besteht aus genau 11 Zeichen, die von encodeURIComponent, jedoch nicht von encodeURI codiert werden:Ich habe diese Tabelle einfach mit console.table in Google Chrome mit folgendem Code generiert:
quelle
var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }
Ich fand diesen Artikel aufschlussreich: Javascript Madness: Query String Parsing
Ich fand es, als ich versuchte zu verstehen, warum decodeURIComponent '+' nicht richtig decodierte. Hier ist ein Auszug:
quelle
encodeURI
es nur in einem ziemlich dunklen Fall nützlich zu sein scheint und wirklich nicht existieren muss. Ich habe einige Meinungsverschiedenheiten mit ihm, aber ich sehe dort nichts völlig Falsches oder Idiotisches. Was genau denkst du ist Unsinn?enctype
Attribut desFORM
Elements gibt den Inhaltstyp an, der zum Codieren des Formulardatensatzes zur Übermittlung an den Server verwendet wird. application / x-www-form-urlencoded Dies ist der Standardinhaltstyp. Mit diesem Inhaltstyp eingereichte Formulare müssen wie folgt codiert werden: [...] Leerzeichen werden durch "+" ersetzt, und [...] nicht alphanumerische Zeichen werden durch "% HH" ersetzt, [...] Ref: HTML4 SepcencodeURIComponent codiert nicht
-_.!~*'()
, was zu Problemen beim Posten von Daten in PHP in einer XML-Zeichenfolge führt.Zum Beispiel:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>
Allgemeine Flucht mit
encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E
Sie können sehen, dass ein einfaches Anführungszeichen nicht codiert ist. Um das Problem zu beheben, habe ich zwei Funktionen zur Lösung des Problems in meinem Projekt für die Codierungs-URL erstellt:
Für die Dekodierung der URL:
quelle
encodeURI () - Die Funktion Escape () dient zum Escaping von Javascript und nicht zu HTTP.
quelle
var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"
... und ich über die Google Ajax-API darauf zugreifen möchte, wie folgt:var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;
... dann muss ich verwendenescape(url)
.encodeURI(url)
funktioniert anscheinend nicht mit solchen Parametern.Kleine Vergleichstabelle Java vs. JavaScript vs. PHP.
quelle
Ich empfehle, eine dieser Methoden nicht so zu verwenden, wie sie ist. Schreiben Sie Ihre eigene Funktion, die das Richtige tut.
MDN hat ein gutes Beispiel für die unten gezeigte URL-Codierung gegeben.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
quelle
Denken Sie auch daran, dass alle unterschiedliche Zeichensätze codieren, und wählen Sie den gewünschten aus. encodeURI () codiert weniger Zeichen als encodeURIComponent (), das weniger (und auch andere als dannyps) Zeichen codiert als Escape ().
quelle
Zum Zwecke der Codierung hat Javascript drei eingebaute Funktionen gegeben -
escape()
- kodiert nicht@*/+
Diese Methode ist nach dem ECMA 3 veraltet und sollte daher vermieden werden.encodeURI()
- codiert nicht~!@#$&*()=:/,;?+'
Es wird davon ausgegangen, dass der URI ein vollständiger URI ist, daher werden keine reservierten Zeichen codiert, die im URI eine besondere Bedeutung haben. Diese Methode wird verwendet, wenn die vollständige URL anstelle eines speziellen URL-Segments konvertiert werden soll. Beispiel -encodeURI('http://stackoverflow.com');
gibt - http://stackoverflow.comencodeURIComponent()
-- _ . ! ~ * ' ( )
codiert nicht Diese Funktion codiert eine URI-Komponente (Uniform Resource Identifier), indem jede Instanz bestimmter Zeichen durch eine, zwei, drei oder vier Escape-Sequenzen ersetzt wird, die die UTF-8-Codierung des Zeichens darstellen. Diese Methode sollte verwendet werden, um eine Komponente der URL zu konvertieren. Zum Beispiel müssen einige Benutzereingaben angehängt werden. Beispiel -encodeURIComponent('http://stackoverflow.com');
gibt - http% 3A% 2F% 2Fstackoverflow.comAlle diese Codierungen werden in UTF 8 ausgeführt, dh die Zeichen werden in das UTF-8-Format konvertiert.
encodeURIComponent unterscheidet sich von encodeURI darin, dass es reservierte Zeichen und das Nummernzeichen # von encodeURI codiert
quelle
Ich habe festgestellt, dass das Experimentieren mit den verschiedenen Methoden eine gute Überprüfung der geistigen Gesundheit ist, selbst wenn man die verschiedenen Verwendungszwecke und Fähigkeiten gut beherrscht.
Zu diesem Zweck fand ich diese Website äußerst nützlich, um meinen Verdacht zu bestätigen, dass ich etwas angemessen mache. Es hat sich auch als nützlich zum Dekodieren einer Zeichenfolge mit encodeURIComponent erwiesen, deren Interpretation ziemlich schwierig sein kann. Ein tolles Lesezeichen:
http://www.the-art-of-web.com/javascript/escape/
quelle
Die akzeptierte Antwort ist gut. Um den letzten Teil zu erweitern:
Wenn Sie auf der sicheren Seite sein möchten, codieren Sie nicht reservierte Zeichen in Prozent codiert werden.
Sie können diese Methode verwenden, um ihnen zu entkommen (Quelle Mozilla )
quelle
Modernes Umschreiben der Antwort von @ johann-echavarria:
Oder wenn Sie eine Tabelle verwenden können, ersetzen Sie diese
console.log
durchconsole.table
(für die schönere Ausgabe).quelle
Inspiriert von Johanns Tisch habe ich beschlossen, den Tisch zu erweitern. Ich wollte sehen, welche ASCII-Zeichen codiert werden.
Code-Snippet anzeigen
Die Tabelle zeigt nur die codierten Zeichen. Leere Zellen bedeuten, dass das Original und die codierten Zeichen identisch sind.
Um extra zu sein, füge ich eine weitere Tabelle für
urlencode()
vs hinzurawurlencode()
. Der einzige Unterschied scheint die Kodierung des Leerzeichens zu sein.quelle
Ich habe diese Funktion ...
quelle
encodeURI
hat, die nicht existieren, aberescape
existieren.