Dovrei usare encodeURI o encodeURIComponent per codificare gli URL?


282

Quale di questi due metodi dovrebbe essere usato per codificare gli URL?



13
Una grande differenza è che encodeURInon codificherà /così: encodeURIComponent("ac/dc")=> ac%2Fdce encodeURI("ac/dc")=>ac/dc

Questo potrebbe essere utile: "encodeURIComponent() and encodeURI() encode a URI by replacing URL reserved characters with their UTF-8 encoding....They differ because encodeURI does not encode queryString or hash values...URLs do not allow many special characters, like spaces or slashes. However these special characters are part of life, so URL encoding was invented." Fonte
user1063287

Vedi anche la sezione specifica intitolata encodeURIComponent differs from encodeURI as follows: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
user1063287

Risposte:


324

Dipende da cosa stai realmente desiderando fare.

encodeURI presuppone che l'input sia un URI completo che potrebbe contenere alcuni caratteri che necessitano di codifica.

encodeURIComponent codificherà tutto con un significato speciale, quindi lo usi per componenti di URI come

var world = "A string with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);

108

Se stai codificando una stringa per inserire un componente URL (un parametro querystring), dovresti chiamare encodeURIComponent.

Se stai codificando un URL esistente, chiama encodeURI.


1
Se sto usando Ajax come posso decodificare l'URL che viene passato a PHP?
Aditya Shukla,

6
Tu no. Il server web lo fa automaticamente.
Quentin,

@Aditya: dipende da cosa stai facendo.
SLaks,

@slaks. Sto passando parametri tramite get, quindi voglio recuperarli in php.
Aditya Shukla,

2
Bene. Avrei potuto parlare un po 'in fretta quando ho detto che il server web lo avrebbe fatto, ma qualunque libreria tu usi per leggere i dati del tuo modulo se ne occuperà per te.
Quentin,

47

xkr.us ha un'ottima discussione, con esempi. Per citare il loro riassunto:

Il metodo escape () non codifica il carattere + che viene interpretato come uno spazio sul lato server e generato da moduli con spazi nei rispettivi campi. A causa di questo difetto e del fatto che questa funzione non riesce a gestire correttamente i caratteri non ASCII, dovresti evitare l'uso di escape () ogni volta che è possibile. La migliore alternativa è di solito encodeURIComponent ().

escape () non codificherà: @ * / +

L'uso del metodo encodeURI () è un po 'più specializzato di escape () in quanto codifica per gli URI rispetto alla querystring, che fa parte di un URL. Utilizzare questo metodo quando è necessario codificare una stringa da utilizzare per qualsiasi risorsa che utilizza URI e necessita che determinati caratteri rimangano non codificati. Si noti che questo metodo non codifica il carattere, in quanto è un carattere valido all'interno degli URI.

encodeURI () non codificherà: ~! @ # $ & * () =: /,;? + '

Infine, il metodo encodeURIComponent () dovrebbe essere utilizzato nella maggior parte dei casi quando si codifica un singolo componente di un URI. Questo metodo codificherà alcuni caratteri che normalmente sarebbero riconosciuti come caratteri speciali per gli URI in modo da poter includere molti componenti. Si noti che questo metodo non codifica il carattere, in quanto è un carattere valido all'interno degli URI.

encodeURIComponent () non codificherà: ~! * () '


Imparato recentemente. I server TOMCAT 9 sono più particolari su ciò che è possibile inviare all'URL. encodeURIComponent () sembra funzionare meglio nei casi in cui hai "spazi" in ciò che devi codificare. A Tomcat 8 non importava, ma 9 è molto più particolare.
Aggie Jon del 87

Quindi, in altre parole, encodeURIfallisce se stai cercando di convertire un nome file in un URL e il nome file è #presente
gman

17

Ecco un riassunto

  1. escape () non codificherà @ * _ + -. /

    Non usarlo.

  2. encodeURI () non codificherà AZ az 0-9; , /? : @ & = + $ - _. ! ~ * '() #

    Usalo quando il tuo input è un URL completo come " https://searchexample.com/search?q=wiki "

  3. encodeURIComponent () non codificherà AZ az 0-9 - _. ! ~ * '() Usalo quando il tuo input fa parte di un URL completo, ad es const queryStr = encodeURIComponent(someString)

1
Questa è una risposta eccellente perché dice esattamente cosa fanno. Comunque ho ancora una domanda su quale dovrei usare e quando. Cosa succede se il mio componente URI è un URL completo? Dovrei quindi utilizzare la Regola 2 o la Regola 3 dall'alto O forse ENTRAMBI come il componente encodeURIC (encodeURI (theCompleteURI))
Panu Logic

10

encodeURIComponent (): presuppone che il suo argomento sia una porzione (come protocollo, nome host, percorso o stringa di query) di un URI. Pertanto sfugge ai caratteri di punteggiatura utilizzati per separare le parti di un URI.

encodeURI (): viene utilizzato per codificare l'URL esistente


7

Differenza tra encodeURIe encodeURIComponent:

encodeURIComponent(value)viene utilizzato principalmente per codificare i valori dei parametri queryString e codifica tutti i caratteri applicabili in value. encodeURIignora il prefisso del protocollo ( http://) e il nome del dominio.


In casi molto, molto rari, quando si desidera implementare la codifica manuale per codificare caratteri aggiuntivi (anche se non è necessario codificarli in casi tipici) come ! *:, è possibile utilizzare:

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

( fonte )


6
Non dovresti sfuggire a quei personaggi nell'URL.
Arashsoft,

Come dice la documentazione citata: "questi personaggi non hanno usi formalizzati per la delimitazione dell'URI"
caesarsol,

@caesarsol così, dovrei modificare la mia risposta. fatemi sapere i vostri pensieri perché non riesco a capire cosa significhi quella documentazione citata.
T.Todua,

è inutile codificare questi caratteri, a meno che tu non stia facendo qualcosa fuori dai normali casi d'uso di codifica URL :)
caesarsol,

2

Altre risposte descrivono gli scopi. Ecco i caratteri che ciascuna funzione convertirà effettivamente :

control = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
        + '\x10\x11\x12\x13\x14\X15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F'
                                                                    + '\x7F'
encodeURI         (control + ' "%<>[\\]^`{|}'                             )
encodeURIComponent(control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + '+/@'        )
escape            (control + ' "%<>[\\]^`{|}' + '#$&,:;=?' +       "!'()~")

Tutti i caratteri sopra sono convertiti in codici percentuale esadecimali. Spazio a %20, percentuale a %25, ecc. I caratteri sottostanti passano invariati.

Ecco i caratteri che le funzioni NON convertiranno :

pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

encodeURI         (pass_thru + '#$&,:;=?' + '+/@' + "!'()~")
encodeURIComponent(pass_thru +                      "!'()~")
escape            (pass_thru +              '+/@'          )

-4

Come regola generale usare encodeURIComponent. Non aver paura del lungo nome pensando che sia più specifico nel suo uso, per me è il metodo più comunemente usato. Inoltre, non farti ingannare dall'uso di encodeURI perché l'hai testato e sembra essere codificato correttamente, probabilmente non è quello che volevi usare e anche se il tuo semplice test usando "Fred" in un campo di nome ha funzionato, troverai più tardi, quando si utilizza un testo più avanzato come l'aggiunta di una e commerciale o di un hashtag, fallirà. Puoi guardare le altre risposte per i motivi per cui questo è.

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.