Qual è la differenza tra decodeURIComponent e decodeURI?


363

Qual è la differenza tra le funzioni JavaScript decodeURIComponente decodeURI?

Risposte:


398

Per spiegare la differenza tra questi due, lasciami spiegare la differenza tra encodeURIe encodeURIComponent.

La differenza principale è che:

  • La encodeURIfunzione è destinata all'uso sull'URI completo.
  • La encodeURIComponentfunzione deve essere utilizzata su ... beh .. componenti URI che sono qualsiasi parte che si trova tra i separatori (; /?: @ & = + $, #).

Quindi, in encodeURIComponentquesti separatori sono codificati anche perché sono considerati come testo e non caratteri speciali.

Ora torniamo alla differenza tra le funzioni di decodifica, ogni funzione decodifica le stringhe generate dalla corrispondente controparte di codifica, occupandosi della semantica dei caratteri speciali e della loro gestione.


4
Un'altra differenza fondamentale è che unescape non gestisce sequenze UTF-8 multi-byte mentre decodeURI [Componente] fa:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris

IMHO, dare alcuni esempi sarebbe molto utile
tradotto il

114

encodeURIComponent / decodeURIComponent () è quasi sempre la coppia che si desidera utilizzare, per concatenare insieme e dividere le stringhe di testo nelle parti URI.

encodeURI in meno comune, e dal nome fuorviante: dovrebbe davvero essere chiamato fixBrokenURI. Prende qualcosa che è quasi un URI, ma contiene caratteri non validi come spazi e lo trasforma in un vero URI. Ha un valido utilizzo nel riparare URI non validi dall'input dell'utente e può anche essere usato per trasformare un IRI (URI con caratteri Unicode nudi in) in un URI semplice (usando UTF-8 con escape% per codificare il non-ASCII ).

decodeURI decodifica gli stessi caratteri di decodeURIComponent tranne alcuni speciali. Viene fornito come un inverso di encodeURI, ma non puoi ancora contare su di esso per restituire lo stesso di quello che hai inserito originariamente - vedi ad es. decodeURI(encodeURI('%20 '));.

Dove encodeURI dovrebbe davvero essere chiamato fixBrokenURI (), decodeURI () potrebbe ugualmente essere chiamato potenzialmenteBreakMyPreviouslyWorkingURI (). Non riesco a pensare a nessun uso valido per questo ovunque; evitare.


11
decodeURI (encodeURI ('% 20')) fornisce correttamente '% 20' in ie, chrome e firefox, chiedendosi solo da quale browser / versione si è ottenuto il risultato errato?
ccppjava,

1
Potrebbe essersi rotto nel 2009, ma nel frattempo il browser moderno ha recuperato (suppongo).
Woodrow Shigeru,

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

Sembra che encodeURIproduca un URI "sicuro" codificando gli spazi e alcuni altri caratteri (ad esempio non stampabili), mentre encodeURIComponentcodifica ulteriormente i due punti, la barra e i caratteri più, e deve essere utilizzato nelle stringhe di query. La codifica di + e? e & è di particolare importanza qui, in quanto si tratta di caratteri speciali nelle stringhe di query.


30

Dato che avevo la stessa domanda, ma non ho trovato la risposta qui, ho fatto alcuni test per capire qual è la differenza. L'ho fatto, poiché ho bisogno della codifica per qualcosa, che non è correlato a URL / URI.

  • encodeURIComponent("A") restituisce "A", non codifica da "A" a "% 41"
  • decodeURIComponent("%41") restituisce "A".
  • encodeURI("A") restituisce "A", non codifica da "A" a "% 41"
  • decodeURI("%41") restituisce "A".

-Questo significa che entrambi possono decodificare caratteri alfanumerici, anche se non li hanno codificati. Però...

  • encodeURIComponent("&") restituisce "% 26".
  • decodeURIComponent("%26") ritorna "&".
  • encodeURI("&") ritorna "&".
  • decodeURI("%26") restituisce "% 26".

Anche se encodeURIComponent non codifica tutti i caratteri, decodeURIComponent può decodificare qualsiasi valore compreso tra% 00 e% 7F.

Nota: sembra che se si tenta di decodificare un valore superiore a% 7F (a meno che non sia un valore unicode), lo script avrà esito negativo con un "errore URI".


Nota: c'è un refuso nel primo componente decodeURIC (m invece di n). Non posso correggerlo, perché devo modificare almeno 6 caratteri.
SuperNova,

23

encodeURIComponent()

Converte l'input in una stringa con codifica URL

encodeURI()

L'URL codifica l'input, ma presuppone che venga fornito un URL completo, quindi restituisce un URL valido non codificando il protocollo (ad es. Http: // ) e il nome host (ad es. Www.stackoverflow.com ).

decodeURIComponent()e decodeURI()sono l'opposto di quanto sopra


12

decodeURIComponent decodificherà i marcatori speciali URI come &,?, #, ecc., decodeURI no.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.