¿Cómo decodifico una cadena con Unicode escapado?
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.com
hasta http://example.com
con JavaScript? Lo intenté unescape
, decodeURI
y decodeURIComponent
supongo 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.
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. decodeURIComponent
es 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
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 gi
parte 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 unescape
función incorporada para decodificar la cadena en su forma adecuada.
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