web-dev-qa-db-fra.com

decodeURIComponent vs unescape, quel est le problème avec unescape?

En répondant à une autre question, j'ai pris conscience que mes connaissances Javascript/DOM étaient devenues un peu dépassées dans la mesure où j'utilise toujours escape/unescape pour coder le contenu des composants URL alors qu'il semble que je devrait maintenant utiliser encodeURIComponent/decodeURIComponent à la place.

Ce que je veux savoir, c'est ce qui ne va pas avec escape/unescape? Il y a de vagues suggestions qu'il y a une sorte de problème autour des caractères Unicode, mais je ne trouve aucune explication définitive.

Mon expérience sur le Web est assez biaisée, presque tout a été écrit de grandes applications Intranet liées à Internet Explorer. Cela a impliqué beaucoup d'utilisation de escape/unescape et les applications impliquées prennent pleinement en charge Unicode depuis de nombreuses années maintenant.

Quels sont donc les problèmes Unicode que escape/unescape sont censés avoir? Quelqu'un a-t-il des cas de test pour démontrer les problèmes?

47
andynormancx

Ce que je veux savoir, c'est ce qui ne va pas avec l'évasion/l'évasion?

Ils ne sont pas "faux" en tant que tels, ils sont juste leur propre format de chaîne spécial qui ressemble un peu à l'encodage des paramètres URI mais qui ne l'est pas. En particulier:

  • "+" Signifie plus, pas d'espace
  • il existe un format spécial "% uNNNN" pour coder les points de code Unicode UTF-16, au lieu de coder les octets UTF-8

Donc, si vous utilisez escape () pour créer des valeurs de paramètres URI, vous obtiendrez des résultats incorrects pour les chaînes contenant un plus ou tout caractère non ASCII.

escape () peut être utilisé comme schéma de codage interne uniquement en JavaScript, par exemple pour échapper les valeurs des cookies. Cependant, maintenant que tous les navigateurs prennent en charge encodeURIComponent (ce qui n'était pas le cas à l'origine), il n'y a aucune raison d'utiliser d'échappement de préférence.

À ma connaissance, il n'y a qu'une seule utilisation moderne de l'évasion/de la fuite, et c'est un moyen rapide d'implémenter un encodeur/décodeur UTF-8, en tirant parti du traitement UTF-8 dans la gestion des composants URIComponent:

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

escape ne fonctionne que sur les caractères compris entre 0 et 255 inclus (ISO-8859-1, qui est en fait des points de code unicode représentables avec un seul octet). (*)

encodeURIComponent fonctionne pour toutes les chaînes que javascript peut représenter (c'est-à-dire toute la gamme du plan multilingue de base d'Unicode, c'est-à-dire les points de code Unicode 0 à 1 114 111 ou 0x10FFFF qui couvrent presque tous les systèmes d'écriture humaine actuellement utilisés).

Les deux fonctions produisent des chaînes sécurisées d'url qui n'utilisent que les points de code 0 à 127 inclus (US-ASCII), que ce dernier accomplit en codant d'abord la chaîne en UTF-8 puis en appliquant le %XX codage hexadécimal familier de escape, à tout point de code qui ne serait pas sûr pour les URL.

C'est d'ailleurs pourquoi vous pouvez faire un encodeur/décodeur UTF-8 à deux fonctions en javascript sans boucles ni génération de déchets, en combinant ces primitives pour annuler tout sauf les effets secondaires du traitement UTF-8 , car les versions unescape et decodeURIComponent font de même en sens inverse.

(*) Note de bas de page: certains navigateurs modernes comme Google Chrome ont été modifiés pour produire% uXXXX pour la plage de 255 caractères ci-dessus, l'échappement n'a pas été défini à l'origine, mais la prise en charge par le serveur Web du décodage ce codage n'est pas aussi bien implémenté que le décodage du codage basé sur UTF-8 normalisé IETF.

9
ecmanaut

La meilleure réponse est que cela fonctionne en ligne sur ce site Web http://meyerweb.com/eric/tools/dencoder/

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

Une autre utilisation "moderne" que j'ai rencontrée consiste à analyser une chaîne encodée en URI qui peut inclure des séquences d'octets UTF8 invalides. Dans certains cas, decodeURIComponent peut lever une exception. Vous devrez peut-être intercepter cette exception et revenir à l'utilisation de Unescape.

Un exemple serait 'tür' encodé en 't% FCr' que j'ai vu Firefox produire (lorsque des caractères sont collés dans la barre d'adresse après le?).

5
sstur