Jaka jest różnica między decodeURIComponent a decodeURI?

363

Jaka jest różnica między funkcjami JavaScript decodeURIComponenta decodeURI?

Jon Tackabury
źródło

Odpowiedzi:

398

Aby wyjaśnić różnicę między tymi dwoma, pozwól mi wyjaśnić różnicę między encodeURIi encodeURIComponent.

Główna różnica polega na tym, że:

  • Ta encodeURIfunkcja jest przeznaczona do użycia z pełnym identyfikatorem URI.
  • Ta encodeURIComponentfunkcja jest przeznaczona do użycia na… cóż… komponentach URI, czyli dowolnej części leżącej między separatorami (; /?: @ & = + $, #).

Tak więc w encodeURIComponenttych separatorach są kodowane również dlatego, że są traktowane jako tekst, a nie znaki specjalne.

Wracając do różnicy między funkcjami dekodowania, każda funkcja dekoduje ciągi znaków generowane przez odpowiadający jej kodowany odpowiednik, dbając o semantykę znaków specjalnych i ich obsługę.

MahdeTo
źródło
4
Kolejną istotną różnicą jest to, że unescape nie obsługuje wielobajtowych sekwencji UTF-8, podczas gdy decodeURI [Component]:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
Chris
IMHO, podając kilka przykładów, byłoby bardzo przydatne
przetłumacz
114

encodeURIComponent / decodeURIComponent () to prawie zawsze para, której chcesz użyć do łączenia ze sobą i dzielenia ciągów tekstowych w częściach URI.

encodeURI w mniej powszechnej i mylącej nazwie: tak naprawdę powinno się nazywać fixBrokenURI. Pobiera coś, co jest prawie URI, ale zawiera nieprawidłowe znaki, takie jak spacje, i zamienia go w prawdziwy URI. Ma prawidłowe zastosowanie w naprawianiu nieprawidłowych identyfikatorów URI na podstawie danych wprowadzonych przez użytkownika, a także może być używany do przekształcania IRI (URI z czystymi znakami Unicode) w zwykły URI (przy użyciu UTF-8 w formacie% do kodowania kodu spoza ASCII ).

decodeURI dekoduje te same znaki, co decodeURIComponent, z wyjątkiem kilku specjalnych. Podano, że jest odwrotnością encodeURI, ale nadal nie możesz liczyć na to, że zwróci to samo, co pierwotnie wstawiłeś - patrz np. decodeURI(encodeURI('%20 '));.

Tam, gdzie naprawdę powinno się nazywać encodeURI fixBrokenURI (), decodeURI () można również nazwać potencjalnieBreakMyPreviouslyWorkingURI (). Nie mogę nigdzie znaleźć uzasadnionego zastosowania; uniknąć.

Bobin
źródło
11
decodeURI (encodeURI ('% 20')) poprawnie podaje '% 20' np. chrome i firefox, tylko zastanawiasz się, z której przeglądarki / wersji zaobserwowałeś nieprawidłowy wynik?
ccppjava,
1
Być może zostały zepsute w 2009 roku, ale tymczasem nowoczesna przeglądarka nadrobiła zaległości (tak sądzę).
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

Wygląda na to, że encodeURItworzy „bezpieczny” identyfikator URI poprzez kodowanie spacji i niektórych innych (np. Niedrukowalnych) znaków, podczas gdy encodeURIComponentdodatkowo koduje dwukropek i ukośnik oraz znaki plus i jest przeznaczony do stosowania w ciągach zapytań. Kodowanie + i? i & ma tutaj szczególne znaczenie, ponieważ są to specjalne znaki w ciągach zapytań.

Jason S.
źródło
30

Ponieważ miałem to samo pytanie, ale nie znalazłem tutaj odpowiedzi, wykonałem kilka testów, aby dowiedzieć się, jaka jest różnica. Zrobiłem to, ponieważ potrzebuję kodowania czegoś, co nie jest związane z URL / URI.

  • encodeURIComponent("A") zwraca „A”, nie koduje „A” na „% 41”
  • decodeURIComponent("%41") zwraca „A”.
  • encodeURI("A") zwraca „A”, nie koduje „A” na „% 41”
  • decodeURI("%41") zwraca „A”.

-Oznacza to, że oba mogą dekodować znaki alfanumeryczne, nawet jeśli ich nie kodowały. Jednak...

  • encodeURIComponent("&") zwraca „% 26”.
  • decodeURIComponent("%26") zwroty "&".
  • encodeURI("&") zwroty "&".
  • decodeURI("%26") zwraca „% 26”.

Mimo że encodeURIComponent nie koduje wszystkich znaków, decodeURIComponent może dekodować dowolną wartość z przedziału od% 00 do% 7F.

Uwaga: Wygląda na to, że jeśli spróbujesz zdekodować wartość powyżej% 7F (chyba że jest to wartość Unicode), wówczas skrypt zakończy się niepowodzeniem z „błędem URI”.

Kul-Tigin
źródło
Uwaga: literówka w pierwszym dekoderzeURIComponent (m zamiast n). Nie mogę tego poprawić, ponieważ muszę edytować co najmniej 6 znaków.
SuperNova,
23

encodeURIComponent()

Konwertuje dane wejściowe na ciąg znaków zakodowany w adresie URL

encodeURI()

Adres URL koduje dane wejściowe, ale zakłada, że ​​podano pełny adres URL, więc zwraca prawidłowy adres URL, nie kodując protokołu (np. Http: // ) i nazwy hosta (np. Www.stackoverflow.com ).

decodeURIComponent()i decodeURI()są przeciwieństwem powyższego

Russ Cam
źródło
12

decodeURIComponent zdekoduje specjalne znaczniki URI, takie jak &,?, # itd., decodeURI nie.

Bjorn
źródło