2012-02-12 14 views
8

C'è qualche uso valido per la funzione encodeURI di javascript?dovrebbe mai essere usato encodeURI?

Per quanto posso dire, quando si sta cercando di fare una richiesta HTTP si dovrebbe neanche avere:

  • un URI completo
  • qualche frammento che si desidera mettere in un URI, che è o una stringa unicode o sequenza di byte UTF-8

Nel primo caso, ovviamente non è necessario fare nulla per richiederlo. Nota: se in realtà vuoi passarlo come parametro (ad es. Url = http ...), in realtà hai un'istanza del secondo caso che sembra un URI.

Nel secondo caso, si dovrebbe sempre convertire una stringa unicode in UTF-8, e quindi chiamare encodeURIComponent per sfuggire tutti caratteri prima di aggiungerlo a un URI. (Se si ha una sequenza di byte UTF-8 invece di una stringa unicode, è possibile saltare il passaggio convert-to-utf8).

Supponendo di non aver perso nulla, non posso vedere un uso valido per encodeURI. Se lo usi, è probabile che tu abbia costruito un URI non valido e poi abbia tentato di "sanitizzarlo" dopo il fatto, il che è semplicemente impossibile poiché non sai quali caratteri sono stati intesi letteralmente e quali sono stati pensati per essere sfuggiti .

Ho visto molti consigli contro l'uso di escape(), ma non vedo nessuno scoraggiare l'encodeURI. Mi manca un uso valido?

+2

Il "frammento che si desidera inserire in un URI", credo, può essere definito un "componente URI". "Nel secondo caso, dovresti sempre convertire una stringa unicode in UTF-8" - non in JavaScript. 'encodeURIComponent' convertirà automaticamente la stringa in UTF-8 prima (e' decodeURIComponent' convertirà gli ottetti UTF-8 in caratteri Unicode). – mgiuca

risposta

10

Ho un blog post che risponde a questa domanda in molti dettagli.

Si dovrebbe mai uso encodeURI per costruire un URI di programmazione, per le ragioni che dici - è necessario utilizzare sempre encodeURIComponent sui singoli componenti, e poi li compongono in un URI completo.

Dove encodeURI è quasi utile è nella "pulizia" un URI, in accordo con Postel's Law ("essere liberale in ciò che accetti, e conservatore in ciò che si invia.") Se qualcuno ti dà un URI completo, può contenere caratteri non consentiti, come spazi, determinati caratteri ASCII (come virgolette) e caratteri Unicode. encodeURI può essere utilizzato per convertire quei caratteri illegali in sequenze legali di escape percentuale, senza delimitatori di codifica. Allo stesso modo, è possibile utilizzare decodeURI per "stampare" un URI, mostrando sequenze con percentuale di escape come caratteri nudi tecnicamente non validi.

Ad esempio, l'URL:

http://example.com/admin/login?name=Helen Ødegård&gender=f 

è illegale, ma è ancora del tutto ambiguo.encodeURI converte nella valida URI:

http://example.com/admin/login?name=Helen%20%C3%98deg%C3%A5rd&gender=f 

Un esempio di un'applicazione che potrebbe desiderare di fare questa sorta di "pulizia URI" è un browser web. Quando si digita un URL nella barra degli indirizzi, si dovrebbe tentare di convertire qualsiasi carattere illegale in escape percentuale, piuttosto che avere un errore. Il software che elabora gli URI (ad es. Un raschiatore HTML che vuole ottenere tutti gli URL nei collegamenti ipertestuali su una pagina) può anche voler applicare questo tipo di pulizia nel caso in cui uno qualsiasi degli URL sia tecnicamente illegale.

Sfortunatamente, encodeURI ha un difetto critico, ovvero che sfugge ai caratteri '%', rendendolo completamente inutile per la pulizia dell'URI (eseguirà il doppio escape di qualsiasi URI che abbia già una percentuale di escape). Ho quindi preso in prestito Mozilla's fixedEncodeURI funzione e migliorato in modo che pulisce correttamente URI:

function fixedEncodeURI(str) { 
    return encodeURI(str).replace(/%25/g, '%').replace(/%5B/g, '[').replace(/%5D/g, ']'); 
} 

Così si dovrebbe sempre usare encodeURIComponent per costruire URI internamente. Non dovresti mai usare mai encodeURI, ma puoi usare il mio fixedEncodeURI per tentare di "pulire" gli URI che sono stati forniti da un'origine esterna (di solito come parte di un'interfaccia utente).

+1

Vedo (e sono d'accordo) l'uso qui, ma non sono convinto che encodeURI sia un'implementazione di ciò che descrivi. encodeURI converte "% 2F" in "% 252F", che cambia il significato di un URI facendo doppio escape di alcuni di esso. – gfxmonk

+0

Argh, hai ragione. Ho aggiornato il mio post sul blog (cerca "Modifica"). Questo contiene una funzione chiamata fixedEncodeURI (presa in prestito da Mozilla e migliorata) che si comporta effettivamente come ho descritto in origine. La vera funzione encodeURI, così com'è, è completa spazzatura. – mgiuca

+0

Ho modificato la risposta per mostrare il difetto in encodeURI, con una soluzione alternativa. – mgiuca

5

encodeURI non codifica quanto segue:, /? : @ & = + $ # mentre lo fa encodeURIComponent.

Ci sono una miriade di motivi per cui si potrebbe voler utilizzare encodeURI su encodeURIComponent, come assegnare un URL come valore variabile. Si desidera mantenere l'URL ma codificare percorsi, stringa di query e valori hash. L'utilizzo di encodeURIComponent renderebbe l'URL non valido.

+1

cosa intendi con "assegnazione di un URL come valore variabile"? Intendi includere un URL come valore in un parametro di query? Se hai un URL come "http://example.com/?x=1&y=2" e vuoi passarlo come parametro di query, dovresti sicuramente usare encodeURIComponent, dato che encodeURI fallirà nel "&". – gfxmonk

+0

var x = myencodedurl; –

+0

Mi dispiace, ma non ha alcun senso. Perché dovresti mai cambiare il _value_ di una stringa (che è ciò che un URI sarà in JS) per memorizzarlo in una variabile? – gfxmonk

Problemi correlati