decodeURIComponent vs unescape, cosa c’è di sbagliato in unescape?

Rispondendo a un’altra domanda, mi sono reso conto che la mia conoscenza Javascript / DOM era diventata un po ‘ decodeURIComponent in quanto sto ancora usando escape / unescape per codificare il contenuto dei componenti URL mentre sembra che ora dovrei usare encodeURIComponent / decodeURIComponent .

Quello che voglio sapere è che cosa c’è di sbagliato nella escape / unescape ? Ci sono alcuni suggerimenti vaghi che ci sia una sorta di problema intorno ai caratteri Unicode, ma non riesco a trovare alcuna spiegazione definitiva.

La mia esperienza sul web è abbastanza parziale, quasi tutto ciò che è successo è scrivere grandi app Intranet legate a Internet Explorer. Ciò ha comportato un grande uso di escape / unescape e le app in questione hanno pienamente supportato Unicode per molti anni.

Quindi quali sono i problemi Unicode che si suppone di dover unescape / unescape ? Qualcuno ha casi di test per dimostrare i problemi?

    Quello che voglio sapere è che cosa c’è di sbagliato nella fuga / unescape?

    Non sono “sbagliati” in quanto tali, sono solo il loro formato di stringa speciale che assomiglia un po ‘alla codifica dei parametri URI, ma in realtà non lo è. In particolare:

    • ‘+’ significa più, non lo spazio
    • esiste un formato speciale “% uNNNN” per la codifica dei punti di codice Unicode UTF-16, invece di codificare i byte UTF-8

    Pertanto, se si utilizza escape () per creare valori di parametro URI, si ottengono risultati errati per stringhe contenenti un segno positivo o qualsiasi carattere non ASCII.

    escape () può essere usato come uno schema di codifica interna solo JavaScript, ad esempio per sfuggire ai valori dei cookie. Tuttavia ora che tutti i browser supportano encodeURIComponent (che non era originariamente il caso), non c’è motivo di usare la fuga preferibilmente.

    C’è solo un uso moderno per escape / unescape che io conosca, ed è un modo rapido per implementare un codificatore / decodificatore UTF-8, sfruttando l’elaborazione UTF-8 nella gestione di URIComponent:

     utf8bytes= unescape(encodeURIComponent(unicodecharacters)); unicodecharacters= decodeURIComponent(escape(utf8bytes)); 

    escape opera solo su caratteri compresi nell’intervallo compreso tra 0 e 255 (ISO-8859-1, che è effettivamente punti di codice unicode rappresentabili con un singolo byte). (*)

    encodeURIComponent funziona per tutte le stringhe che javascript può rappresentare (che è l’intera gamma del piano multilingue di base di unicode, ovvero i punti codice unicode da 0 a 1,114,111 o 0x10FFFF che coprono quasi tutti i sistemi di scrittura umana in uso corrente).

    Entrambe le funzioni producono stringhe url sicure che utilizzano solo i punti di codice da 0 a 127 inclusi (US-ASCII), che quest’ultima esegue prima codificando la stringa come UTF-8 e quindi applicando la codifica esadecimale %XX familiare dall’uscita, a qualsiasi punto di codice non sarebbe sicuro.

    Questo è anche il motivo per cui è ansible creare un codificatore / decodificatore UTF-8 a due funzioni in javascript senza loop o generazione di rifiuti, combinando queste primitive per cancellare tutti gli effetti secondari di elaborazione UTF-8, come le versioni unescape e decodeURIComponent fare lo stesso al contrario.

    (*) Nota del piede: alcuni browser moderni come Google Chrome sono stati ottimizzati per produrre% uXXXX per l’intervallo di caratteri sopra-255 per cui l’escape non è stato originariamente definito, ma il supporto del server Web per la decodifica che la codifica non è implementata come decodifica della codifica basata su UTF-8 standardizzata da IETF.

    La migliore risposta è che funziona online su questo sito http://meyerweb.com/eric/tools/dencoder/

     function decode() { var obj = document.getElementById('dencoder'); var encoded = obj.value; obj.value = decodeURIComponent(encoded.replace(/\+/g, " ")); } 

    Un altro uso “moderno” che ho incontrato è quello di analizzare una stringa con codifica URI che potrebbe includere sequenze di byte UTF8 non valide. In alcuni casi decodeURIComponent può generare un’eccezione. Potrebbe essere necessario prendere questa eccezione e ricorrere a unescape.

    Un esempio sarebbe “tür” codificato come “t% FCr” che ho visto produrre da Firefox (quando i caratteri sono incollati nella barra degli indirizzi dopo il?).