Jaka jest różnica między funkcjami JavaScript decodeURIComponenta decodeURI?
Jaka jest różnica między funkcjami JavaScript decodeURIComponenta decodeURI?
Odpowiedzi:
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:
encodeURIfunkcja jest przeznaczona do użycia z pełnym identyfikatorem URI.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ę.
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ąć.
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ń.
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”.
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
encodeURIComponent Not Escaped:
A-Z a-z 0-9 - _ . ! ~ * ' ( )
encodeURI () Not Escaped:
A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
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
decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";