Was ist der Unterschied zwischen decodeURIComponent und decodeURI?

363

Was ist der Unterschied zwischen den JavaScript-Funktionen decodeURIComponentund decodeURI?

Jon Tackabury
quelle

Antworten:

398

Um den Unterschied zwischen diesen beiden zu erklären, möchte ich den Unterschied zwischen encodeURIund erklären encodeURIComponent.

Der Hauptunterschied ist, dass:

  • Die encodeURIFunktion ist für die Verwendung auf dem vollständigen URI vorgesehen.
  • Die encodeURIComponentFunktion soll für .. gut .. URI-Komponenten verwendet werden, bei denen es sich um Teile handelt, die zwischen Trennzeichen liegen (; / ?: @ & = + $, #).

In encodeURIComponentdiesen werden Trennzeichen also auch deshalb codiert, weil sie als Text und nicht als Sonderzeichen betrachtet werden.

Zurück zum Unterschied zwischen den Decodierungsfunktionen: Jede Funktion decodiert Zeichenfolgen, die von ihrem entsprechenden Codierungsgegenstück generiert wurden, wobei die Semantik der Sonderzeichen und ihre Behandlung berücksichtigt werden.

MahdeTo
quelle
4
Ein weiterer entscheidender Unterschied besteht darin, dass unescape keine Multi-Byte-UTF-8-Sequenzen verarbeitet, während decodeURI [Component] Folgendes tut:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris
IMHO, einige Beispiele zu nennen, wäre sehr nützlich
Transang
114

encodeURIComponent / decodeURIComponent () ist fast immer das Paar, das Sie zum Verketten und Aufteilen von Textzeichenfolgen in URI-Teilen verwenden möchten.

encodeURI ist weniger verbreitet und irreführend benannt: Es sollte eigentlich fixBrokenURI heißen. Es braucht etwas, das fast eine URI ist, aber ungültige Zeichen wie Leerzeichen enthält, und verwandelt es in eine echte URI. Es hat eine gültige Verwendung beim Korrigieren ungültiger URIs aus Benutzereingaben und kann auch verwendet werden, um einen IRI (URI mit bloßen Unicode-Zeichen in) in einen einfachen URI umzuwandeln (unter Verwendung von% -escaped UTF-8 zum Codieren des Nicht-ASCII ).

decodeURI dekodiert bis auf einige Sonderzeichen dieselben Zeichen wie decodeURIComponent. Es wird als Inverse von encodeURI bereitgestellt, aber Sie können sich immer noch nicht darauf verlassen, dass es dasselbe zurückgibt, wie Sie es ursprünglich eingegeben haben - siehe z. decodeURI(encodeURI('%20 '));.

Wo encodeURI eigentlich fixBrokenURI () heißen sollte, könnte decodeURI () auch potentiell BreakMyPreviousWorkingURI () heißen. Ich kann mir nirgendwo eine gültige Verwendung dafür vorstellen; vermeiden.

Bobince
quelle
11
decodeURI (encodeURI ('% 20')) gibt '% 20' korrekt in dh Chrome und Firefox an und fragt sich nur, von welchem ​​Browser / welcher Version das falsche Ergebnis Sie beobachtet haben?
ccppjava
1
Könnte 2009 kaputt gegangen sein, aber der moderne Browser hat in der Zwischenzeit aufgeholt (meine Vermutung).
WoodrowShigeru
68
js> s = "http://www.example.com/string with + and ? and & and spaces";
http://www.example.com/string with + and ? and & and spaces
js> encodeURI(s)
http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces
js> encodeURIComponent(s)
http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces

Es sieht so encodeURIaus, als würde durch Codieren von Leerzeichen und einigen anderen (z. B. nicht druckbaren) Zeichen ein "sicherer" URI erzeugt, während encodeURIComponentzusätzlich der Doppelpunkt sowie Schrägstriche und Pluszeichen codiert werden und in Abfragezeichenfolgen verwendet werden sollen. Die Kodierung von + und? und & ist hier von besonderer Bedeutung, da dies Sonderzeichen in Abfragezeichenfolgen sind.

Jason S.
quelle
30

Da ich die gleiche Frage hatte, aber hier keine Antwort fand, machte ich einige Tests, um herauszufinden, was der Unterschied tatsächlich ist. Ich habe dies getan, da ich die Codierung für etwas benötige, das nicht mit URL / URI zusammenhängt.

  • encodeURIComponent("A") gibt "A" zurück, es wird "A" nicht in "% 41" codiert.
  • decodeURIComponent("%41") gibt "A" zurück.
  • encodeURI("A") gibt "A" zurück, es wird "A" nicht in "% 41" codiert.
  • decodeURI("%41") gibt "A" zurück.

-Das bedeutet, dass beide alphanumerische Zeichen dekodieren können, obwohl sie diese nicht kodiert haben. Jedoch...

  • encodeURIComponent("&") gibt "% 26" zurück.
  • decodeURIComponent("%26") kehrt zurück "&".
  • encodeURI("&") kehrt zurück "&".
  • decodeURI("%26") gibt "% 26" zurück.

Obwohl encodeURIComponent nicht alle Zeichen codiert, kann decodeURIComponent jeden Wert zwischen% 00 und% 7F decodieren.

Hinweis: Wenn Sie versuchen, einen Wert über% 7F zu dekodieren (es sei denn, es handelt sich um einen Unicode-Wert), schlägt Ihr Skript anscheinend mit einem "URI-Fehler" fehl.

Kul-Tigin
quelle
Hinweis: In der ersten decodeURIComponent befindet sich ein Tippfehler (m statt n). Ich kann es nicht korrigieren, da ich mindestens 6 Zeichen bearbeiten muss.
SuperNova
23

encodeURIComponent()

Konvertiert die Eingabe in eine URL-codierte Zeichenfolge

encodeURI()

URL-codiert die Eingabe, setzt jedoch voraus, dass eine vollständige URL angegeben ist, und gibt daher eine gültige URL zurück, indem das Protokoll (z. B. http: // ) und der Hostname (z . B. www.stackoverflow.com ) nicht codiert werden .

decodeURIComponent()und decodeURI()sind das Gegenteil von oben

Russ Cam
quelle
12

decodeURIComponent dekodiert spezielle URI-Marker wie &,?, # usw., decodeURI nicht.

Björn
quelle