Was ist der Unterschied zwischen decodeURIComponent und decodeURI?


363

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

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.


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.


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.


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.


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


12

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.