Aby wyjaśnić różnicę między tymi dwoma, pozwól mi wyjaśnić różnicę między encodeURI
i encodeURIComponent
.
Główna różnica polega na tym, że:
- Ta
encodeURI
funkcja jest przeznaczona do użycia z pełnym identyfikatorem URI.
- Ta
encodeURIComponent
funkcja jest przeznaczona do użycia na… cóż… komponentach URI, czyli dowolnej części leżącej między separatorami (; /?: @ & = + $, #).
Tak więc w encodeURIComponent
tych 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ę.
decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
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ąć.
źródło
Wygląda na to, że
encodeURI
tworzy „bezpieczny” identyfikator URI poprzez kodowanie spacji i niektórych innych (np. Niedrukowalnych) znaków, podczas gdyencodeURIComponent
dodatkowo 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ń.źródło
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”.
źródło
decodeURIComponent()
idecodeURI()
są przeciwieństwem powyższegoźródło
decodeURIComponent zdekoduje specjalne znaczniki URI, takie jak &,?, # itd., decodeURI nie.
źródło
encodeURIComponent Not Escaped:
encodeURI () Not Escaped:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
źródło