¿Cómo decodifico una cadena con Unicode escapado?

Resuelto styfle asked hace 13 años • 7 respuestas

No estoy seguro de cómo se llama esto, así que tengo problemas para buscarlo. ¿ Cómo puedo decodificar una cadena con Unicode desde http\u00253A\u00252F\u00252Fexample.comhasta http://example.comcon JavaScript? Lo intenté unescape, decodeURIy decodeURIComponentsupongo que lo único que queda es reemplazar la cadena.

EDITAR: la cadena no está escrita, sino una subcadena de otro fragmento de código. Entonces, para resolver el problema debes comenzar con algo como esto:

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

Espero que eso muestre por qué unescape() no funciona.

styfle avatar Oct 25 '11 12:10 styfle
Aceptado

Editar (2017-10-12) :

@MechaLynx y @Kevin-Weber señalan que unescape()está obsoleto en entornos que no son de navegador y no existe en TypeScript. decodeURIComponentes un reemplazo directo. Para una compatibilidad más amplia, utilice lo siguiente en su lugar:

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

Respuesta original:

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

Puedes descargar todo el trabajo aJSON.parse

radicand avatar Oct 13 '2012 04:10 radicand

ACTUALIZACIÓN : Tenga en cuenta que esta es una solución que debería aplicarse a navegadores más antiguos o plataformas que no sean navegadores, y se mantiene activa con fines instructivos. Consulte la respuesta de @radicand a continuación para obtener una respuesta más actualizada.


Esta es una cadena unicode con escape. Primero se escapó la cadena y luego se codificó con Unicode. Para volver a la normalidad:

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

Para explicar: uso una expresión regular para buscar \u0025. Sin embargo, dado que solo necesito una parte de esta cadena para mi operación de reemplazo, uso paréntesis para aislar la parte que voy a reutilizar 0025. Esta parte aislada se llama grupo.

La giparte al final de la expresión indica que debe coincidir con todas las instancias de la cadena, no solo con la primera, y que la coincidencia no debe distinguir entre mayúsculas y minúsculas. Esto puede parecer innecesario dado el ejemplo, pero agrega versatilidad.

Ahora, para convertir de una cadena a la siguiente, necesito ejecutar algunos pasos en cada grupo de cada coincidencia, y no puedo hacerlo simplemente transformando la cadena. Afortunadamente, la operación String.replace puede aceptar una función, que se ejecutará para cada coincidencia. El retorno de esa función reemplazará la coincidencia misma en la cadena.

Utilizo el segundo parámetro que acepta esta función, que es el grupo que necesito usar, y lo transformo a la secuencia utf-8 equivalente, luego uso la unescapefunción incorporada para decodificar la cadena en su forma adecuada.

Ioannis Karadimas avatar Oct 25 '2011 06:10 Ioannis Karadimas

Tenga en cuenta que el uso de unescape()está obsoleto y no funciona con el compilador TypeScript, por ejemplo.

Según la respuesta del radicando y la sección de comentarios a continuación, aquí hay una solución actualizada:

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

http://example.com

Kevin Weber avatar Nov 03 '2016 20:11 Kevin Weber