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?
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:
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));
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.
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, " "));
}
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?).