2858 Stimmen

URL in JavaScript kodieren?

Wie kodiert man eine URL sicher mit JavaScript, so dass sie in eine GET-Zeichenfolge eingefügt werden kann?

var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;

Ich gehe davon aus, dass Sie die Kodierung der myUrl Variable in dieser zweiten Zeile?

30 Stimmen

Versuchen Sie es mit encodeURI() y decodeURI() .

1 Stimmen

1 Stimmen

Sie können dieses Tool hier verwenden: phillihp.com/toolz/url-encode-decode

3175voto

Buu Nguyen Punkte 48055

Sehen Sie sich die integrierte Funktion encodeURIComponent(str) y encodeURI(str) .
In Ihrem Fall sollte dies funktionieren:

var myOtherUrl = 
       "http://example.com/index.html?url=" + encodeURIComponent(myUrl);

13 Stimmen

Wie wäre es, die von @cms gegebene Erklärung hinzuzufügen? escape ist auch eine gültige Option.

12 Stimmen

Laut @CMS encodeURI ist für die URL-Kodierung nicht wirklich sicher.

17 Stimmen

@AnaelFavre, weil es die gesamte URL verschlüsseln soll, die keine Zeichen wie : , / , @ usw. Diese 2 Methoden sind nicht austauschbar, Sie müssen wissen, was Sie kodieren, um die richtige Methode zu verwenden.

1686voto

Christian C. Salvadó Punkte 763569

Sie haben drei Möglichkeiten:

  • escape() nicht kodiert werden: @*/+

  • encodeURI() nicht kodiert werden: ~!@#$&*()=:/,;?+'

  • encodeURIComponent() nicht kodiert werden: ~!*()'

Aber in Ihrem Fall, wenn Sie eine URL in eine GET Parameter einer anderen Seite, sollten Sie escape o encodeURIComponent , aber nicht encodeURI .

Siehe Stack Overflow Frage Bewährte Praxis: Escape oder encodeURI / encodeURIComponent für weitere Diskussionen.

86 Stimmen

Die mit Escape verwendete Zeichenkodierung ist variabel. Bleiben Sie bei encodeURI und encodeURIComponent, die UTF-8 verwenden.

8 Stimmen

Seien Sie vorsichtig. Dieser Escape konvertiert Nicht-ASCII-Zeichen in seine Unicode-Escape-Sequenzen, wie %uxxx .

4 Stimmen

Ich verwende encodeURIComponent und bemerke, dass es keine Pipe-Zeichen kodieren wird |

205voto

Mike Brennan Punkte 2938

Bleiben Sie bei encodeURIComponent() . Die Funktion encodeURI() macht sich nicht die Mühe, viele Zeichen zu kodieren, die in URLs semantische Bedeutung haben (z. B. "#", "?" und "&"). escape() ist veraltet und macht sich nicht die Mühe, "+"-Zeichen zu kodieren, die auf dem Server als kodierte Leerzeichen interpretiert werden (und kodiert, wie von anderen hier bemerkt, nicht-ASCII-Zeichen in der URL nicht richtig).

Es gibt eine schöne Erklärung des Unterschieds zwischen encodeURI() y encodeURIComponent() anderswo. Wenn Sie etwas so kodieren wollen, dass es sicher als Bestandteil eines URI (z. B. als Abfrage-String-Parameter) aufgenommen werden kann, sollten Sie encodeURIComponent() .

98voto

Ryan Taylor Punkte 10733

Die beste Antwort ist die Verwendung von encodeURIComponent auf Werte in der Abfragezeichenfolge (und nirgendwo sonst).

Ich habe jedoch festgestellt, dass viele APIs " " durch "+" ersetzen wollen, so dass ich das Folgende verwenden musste:

const value = encodeURIComponent(value).replace('%20','+');
const url = 'http://example.com?lang=en&key=' + value

escape ist in verschiedenen Browsern unterschiedlich implementiert und encodeURI kodiert nicht viele Zeichen (wie # und sogar /) - es ist dafür gemacht, auf eine vollständige URI/URL angewendet zu werden, ohne sie zu zerstören - was nicht besonders hilfreich oder sicher ist.

Und wie @Jochem weiter unten anmerkt, sollten Sie vielleicht encodeURIComponent() auf einen (jeden) Ordnernamen, aber aus irgendeinem Grund scheinen diese APIs nicht zu wollen + in Ordnernamen so einfach wie möglich encodeURIComponent funktioniert hervorragend.

Beispiel:

const escapedValue = encodeURIComponent(value).replace('%20','+');
const escapedFolder = encodeURIComponent('My Folder'); // no replace
const url = `http://example.com/${escapedFolder}/?myKey=${escapedValue}`;

26 Stimmen

Bitte beachten Sie, dass Sie %20 nur nach dem ersten Fragezeichen (das ist der "Abfrage"-Teil der URL) durch +-Symbole ersetzen sollten. Nehmen wir an, ich möchte Folgendes aufrufen http://somedomain/this dir has spaces/info.php?a=this has also spaces . Es sollte in umgewandelt werden: http://somedomain/this%20dir%20has%spaces/info.php?a=this%20‌​has%20also%20spaces aber viele Implementierungen lassen zu, dass "%20" im Querystring durch "+" ersetzt wird. Sie können jedoch nicht '%20' durch '+' im Pfadteil der URL ersetzen, da dies zu einem Not Found-Fehler führt, es sei denn, Sie haben ein Verzeichnis mit einem + anstelle eines Leerzeichens.

0 Stimmen

@Jochem Kuijpers, Sie würden auf jeden Fall kein "+" in ein Verzeichnis einfügen. Ich würde dies nur auf die Abfrageparameterwerte selbst (oder Schlüssel, falls erforderlich) anwenden, nicht auf die gesamte URL oder sogar den gesamten Abfrage-String.

0 Stimmen

Ich würde eher den Wert als das Ergebnis der Kodierung ersetzen

43voto

Maksym Kozlenko Punkte 9891

Ich würde vorschlagen, Folgendes zu verwenden qs npm-Paket

qs.stringify({a:"1=2", b:"Test 1"}); // gets a=1%3D2&b=Test+1

es ist einfacher, mit JS-Objekt zu verwenden und es gibt Ihnen richtige URL-Kodierung für alle Parameter

Wenn Sie jQuery verwenden, würde ich mich für $.param Methode. Die URL kodiert ein Objekt, das Felder auf Werte abbildet, was einfacher zu lesen ist als der Aufruf einer Escape-Methode für jeden Wert.

$.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1

0 Stimmen

Ich denke, dieses Beispiel ist ausreichend. Wenn Sie mehr Informationen über $.param auf api.jquery.com/jquery.param

0 Stimmen

Fast jeder verwendet jQuery und ich fühle mich in der Tat wohler damit als mit encoreURIComponent

0 Stimmen

Qs großes, kompaktes und nützliches Paket. Stimmen Sie für die qs auf Backend

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