Podczas kodowania ciągu zapytania, który ma zostać wysłany na serwer sieciowy - kiedy używasz escape()
i kiedy używasz encodeURI()
lub encodeURIComponent()
:
Użyj ucieczki:
escape("% +&=");
LUB
użyj encodeURI () / encodeURIComponent ()
encodeURI("http://www.google.com?var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2")
jest to typowy przypadek użycia. Ten przykład zakoduje i , co prawdopodobnie nie jest zamierzone! jest zwykle stosowany osobno tylko do wartości w każdej parze wartości klucza (część po każdej ).=
&
encodeURIComponent
=
var params = encodeURIComponent(key) + '=' + encodeURIComponent(value);
- Może ktoś inny zna lepszy sposób.Odpowiedzi:
ucieczka()
Nie używaj tego!
escape()
jest zdefiniowany w sekcji B.2.1.2 ucieczka, a tekst wprowadzający do załącznika B mówi:Zachowanie:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
Znaki specjalne są kodowane z wyjątkiem: @ * _ + -. /
Formularz szesnastkowy dla bohaterów, których kod jest jednostka wartość 0xFF lub mniej, to sekwencja ucieczki dwucyfrowa:
%xx
.W przypadku znaków o większej jednostce kodu stosuje się czterocyfrowy format
%uxxxx
. Jest to niedozwolone w ciągu zapytania (zgodnie z definicją w RFC3986 ):Znak procentu jest dozwolony tylko wtedy, gdy bezpośrednio po nim następują dwie cyfry szesnastkowe, a następnie procent
u
nie jest dozwolony.encodeURI ()
Użyj encodeURI, jeśli potrzebujesz działającego adresu URL. Zadzwoń:
uzyskać:
Nie wywołuj encodeURIComponent, ponieważ zniszczyłby adres URL i zwrócił
encodeURIComponent ()
Użyj encodeURIComponent, jeśli chcesz zakodować wartość parametru URL.
Następnie możesz utworzyć potrzebny adres URL:
Otrzymasz ten pełny adres URL:
http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55¶m2=99
Zauważ, że encodeURIComponent nie zmienia
'
znaku. Częstym błędem jest używanie go do tworzenia atrybutów HTML, takich jakhref='MyUrl'
, które mogą cierpieć z powodu błędu wstrzykiwania. Jeśli konstruujesz HTML z ciągów znaków, użyj"
zamiast'
cudzysłowów atrybutów lub dodaj dodatkową warstwę kodowania ('
może być zakodowana jako% 27).Aby uzyskać więcej informacji na temat tego rodzaju kodowania, możesz sprawdzić: http://en.wikipedia.org/wiki/Percent-encoding
źródło
'
je'
) przed umieszczeniem w dokumencie HTML.Różnica między
encodeURI()
iencodeURIComponent()
wynosi dokładnie 11 znaków zakodowanych przez encodeURIComponent, ale nie przez encodeURI:Wygenerowałem tę tabelę z łatwością za pomocą console.table w Google Chrome z tym kodem:
źródło
var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }
Znalazłem ten artykuł pouczający: JavaScript Madness: Query String Parsing
Znalazłem to, gdy próbowałem podkreślić i dlaczego decodeURIComponent nie dekodował poprawnie „+”. Oto wyciąg:
źródło
encodeURI
wydaje się przydatny tylko w dość niejasnym przypadku i naprawdę nie musi istnieć. Mam z nim pewne różnice zdań, ale nie widzę w tym nic wprost fałszywego lub idiotycznego. Co dokładnie uważasz za nonsens?enctype
AtrybutemFORM
Określa element typ zawartości używany do kodowania zestawu danych formularza do składania do serwera. application / x-www-form-urlencoded Jest to domyślny typ zawartości. Formularze przesłane z tym typem treści muszą być kodowane w następujący sposób: [...] Znaki spacji są zastępowane przez `` + ', a [...] Znaki niealfanumeryczne są zastępowane przez `% HH', [...] Ref: HTML4 SepcencodeURIComponent nie koduje
-_.!~*'()
, co powoduje problem z wysyłaniem danych do php w ciągu xml.Na przykład:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>
Ogólna ucieczka z
encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E
Widzisz, pojedynczy cytat nie jest zakodowany. Aby rozwiązać problem, stworzyłem dwie funkcje rozwiązania problemu w moim projekcie, dla Kodowania adresu URL:
W przypadku dekodowania adresu URL:
źródło
encodeURI () - funkcja escape () służy do zmiany znaczenia javascript, a nie HTTP.
źródło
var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"
... I chcę uzyskać do niego dostęp za pośrednictwem interfejsu API Google Ajax, w ten sposób:var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;
... to muszę go użyćescape(url)
.encodeURI(url)
nie działa z takimi parametrami, jak się wydaje.Mała tabela porównawcza Java vs. JavaScript vs. PHP.
źródło
Zalecam, aby nie używać takiej metody, jaka jest. Napisz swoją własną funkcję, która działa poprawnie.
MDN podał dobry przykład kodowania adresów URL pokazany poniżej.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
źródło
Pamiętaj również, że wszystkie kodują różne zestawy znaków i odpowiednio wybierz ten, którego potrzebujesz. encodeURI () koduje mniej znaków niż encodeURIComponent (), który koduje mniej (a także inaczej niż w punkcie Dannypa) znaków niż escape ().
źródło
W celu kodowania javascript ma trzy wbudowane funkcje -
escape()
- nie koduje@*/+
Ta metoda jest przestarzała po ECMA 3, dlatego należy jej unikać.encodeURI()
- nie koduje~!@#$&*()=:/,;?+'
Zakłada, że URI jest pełnym URI, więc nie koduje znaków zastrzeżonych, które mają specjalne znaczenie w URI. Ta metoda jest używana, gdy celem jest konwersja pełnego adresu URL zamiast jakiegoś specjalnego segmentu adresu URL. Przykład -encodeURI('http://stackoverflow.com');
da - http://stackoverflow.comencodeURIComponent()
- nie koduje- _ . ! ~ * ' ( )
Ta funkcja koduje składnik Uniform Resource Identifier (URI), zastępując każdą instancję niektórych znaków jedną, dwiema, trzema lub czterema sekwencjami ucieczki reprezentującymi kodowanie UTF-8 znaku. Tej metody należy użyć do konwersji składnika adresu URL. Na przykład należy dołączyć dane wejściowe użytkownika Przykład -encodeURIComponent('http://stackoverflow.com');
da - http% 3A% 2F% 2Fstackoverflow.comCałe to kodowanie odbywa się w UTF 8, tzn. Znaki zostaną przekonwertowane w formacie UTF-8.
encodeURIComponent różni się od encodeURI tym, że koduje znaki zastrzeżone i znak numeryczny # encodeURI
źródło
Przekonałem się, że eksperymentowanie z różnymi metodami jest dobrym sprawdzianem zdrowia psychicznego, nawet jeśli dobrze rozumiesz, jakie są ich różne zastosowania i możliwości.
W tym celu uważam, że ta strona internetowa jest niezwykle przydatna do potwierdzenia moich podejrzeń, że robię coś odpowiednio. Okazało się także przydatne do dekodowania łańcucha znaków encodeURIComponent, którego interpretacja może być trudna. Świetna zakładka do:
http://www.the-art-of-web.com/javascript/escape/
źródło
Przyjęta odpowiedź jest dobra. Aby rozszerzyć ostatnią część:
Jeśli chcesz być bezpieczny, należy również zakodować procent kodowania niezarezerwowanych znaków .
Możesz użyć tej metody, aby je uciec (źródło Mozilla )
źródło
Współczesne przepisanie odpowiedzi @ johann-echavarria:
Lub jeśli można użyć tabeli, należy wymienić
console.log
zconsole.table
(na wyjściu ładniejszej).źródło
Zainspirowany stołem Johanna postanowiłem go przedłużyć. Chciałem zobaczyć, które znaki ASCII zostaną zakodowane.
Pokaż fragment kodu
Tabela pokazuje tylko zakodowane znaki. Puste komórki oznaczają, że oryginalne i zakodowane znaki są takie same.
Wystarczy być ekstra, Dodaję kolejny tabeli
urlencode()
kontrarawurlencode()
. Jedyną różnicą wydaje się być kodowanie znaku spacji.źródło
Mam tę funkcję ...
źródło
encodeURI
nie istnieje, aleescape
istnieje.