Comment décoder une chaîne avec Unicode échappé?

Je ne suis pas sûr de ce qu'on appelle, alors j'ai du mal à le chercher. Comment puis-je décoder une chaîne avec unicode de httpu00253Au00252Fu00252Fexample.com à http://example.com avec JavaScript? J'ai essayé unescape, decodeURI, et decodeURIComponent, donc je suppose que la seule chose qui reste est la chaîne à remplacer.

EDIT: la chaîne n'est pas tapée, mais plutôt une sous-chaîne d'un autre morceau de code. Donc pour résoudre le problème, vous devez commencer avec quelque chose comme ceci:

var s = 'http\u00253A\u00252F\u00252Fexample.com';

J'espère que cela montre pourquoi unescape () ne fonctionne pas.

70
demandé sur styfle 2011-10-25 09:36:38

5 réponses

Réponse originale:

unescape(JSON.parse('"http\\u00253A\\u00252F\\u00252Fexample.com"'));
> 'http://example.com'

Vous pouvez décharger tout le travail à JSON.parse

Modifier (2017-10-12):

@MechaLynx et @ Kevin-Weber notent que unescape() est obsolète des environnements non-navigateurs et n'existe pas dans TypeScript. {[4] } est un remplacement drop-in. Pour une compatibilité plus large, utilisez le ci-dessous à la place:

decodeURIComponent(JSON.parse('"http\\u00253A\\u00252F\\u00252Fexample.com"'));
> 'http://example.com'
82
répondu radicand 2017-10-12 20:57:45

UPDATE : Veuillez noter qu'il s'agit d'une solution qui devrait s'appliquer aux navigateurs plus anciens ou aux plates-formes non-navigateurs, et qui est maintenue en vie à des fins pédagogiques. Veuillez vous référer à la réponse de @radicand ci-dessous pour une réponse plus à jour.


C'est une chaîne échappée unicode. D'abord, la chaîne a été échappée, puis encodée avec unicode. Pour revenir à la normale:

var x = "http\\u00253A\\u00252F\\u00252Fexample.com";
var r = /\\u([\d\w]{4})/gi;
x = x.replace(r, function (match, grp) {
    return String.fromCharCode(parseInt(grp, 16)); } );
console.log(x);  // http%3A%2F%2Fexample.com
x = unescape(x);
console.log(x);  // http://example.com

Pour expliquer: - je utiliser une expression régulière pour rechercher \u0025. Cependant, puisque je n'ai besoin que d'une partie de cela chaîne pour mon opération de remplacement, j'utilise des parenthèses pour isoler la partie que je vais réutiliser, 0025. Cette partie isolée est appelée un groupe.

La Partie gi à la fin de l'expression indique qu'elle doit correspondre à toutes les instances de la chaîne, pas seulement à la première, et que la correspondance doit être insensible à la casse. Cela peut sembler inutile compte tenu de l'exemple, mais cela ajoute de la polyvalence.

Maintenant, pour convertir d'une chaîne à la suivante, j'ai besoin d'exécuter quelques étapes sur chaque groupe de chaque match, et je ne peux pas le faire en transformant simplement la chaîne. Utilement, la chaîne.remplacer l'opération peut accepter une fonction qui sera exécutée pour chaque match. Le retour de cette fonction remplacera la correspondance elle-même dans la chaîne.

J'utilise le deuxième paramètre que cette fonction accepte, qui est le groupe que je dois utiliser, et le transforme en séquence utf-8 équivalente, puis utilise la fonction unescape intégrée pour décoder la chaîne à sa forme appropriée.

99
répondu Ioannis Karadimas 2018-02-22 08:03:15

Notez que l'utilisation de unescape() est obsolète et ne fonctionne pas avec le Tapuscrit compilateur, par exemple.

Basé sur la réponse de radicand et la section commentaires ci-dessous, voici une solution mise à jour:

var string = "http\\u00253A\\u00252F\\u00252Fexample.com";
decodeURIComponent(JSON.parse('"' + string.replace(/\"/g, '\\"') + '"'));

http://example.com

12
répondu Kevin Weber 2016-11-03 20:43:20

Jetez un oeil à cette page: http://www.rishida.net/tools/conversion/

Collez votre code dans la zone de texte supérieure (supprimez d'abord les doubles barres obliques).

Le code est open source: http://www.rishida.net/tools/conversion/conversionfunctions.js

3
répondu Petah 2017-10-13 15:10:13

Je n'ai pas assez de représentants pour mettre cela sous Commentaires aux réponses existantes:

unescape n'est obsolète que pour travailler avec des uri (ou tout utf-8 encodé), ce qui est probablement le cas pour les besoins de la plupart des gens. encodeURIComponent convertit une chaîne js en UTF-8 échappé et decodeURIComponent ne fonctionne que sur les octets UTF-8 échappés. Il génère une erreur pour quelque chose comme decodeURIComponent('%a9'); // error car l'ASCII étendu n'est pas valide utf-8 (même si c'est toujours une valeur unicode), alors que unescape('%a9'); // © Vous devez donc connaître vos données lors de l'utilisation decodeURIComponent.

DecodeURIComponent ne fonctionnera pas sur "%C2" ou tout octet solitaire sur 0x7f car en utf-8 cela indique une partie d'un substitut. Cependant decodeURIComponent("%C2%A9") //gives you © Unescape ne fonctionnerait pas correctement sur ce // © et il ne lancerait pas d'erreur, donc unescape peut conduire à un code bogué si vous ne connaissez pas vos données.

2
répondu aamarks 2018-03-15 22:21:57