quitar - unicode javascript
¿Cómo decodifico una cadena con unicode escapado? (5)
No estoy seguro de cómo se llama, así que tengo problemas para buscarlo. ¿Cómo puedo decodificar una cadena con unicode desde http/u00253A/u00252F/u00252Fexample.com
a http://example.com
con JavaScript? Intenté decodeURI
, decodeURI
y decodeURIComponent
así que supongo que lo único que queda es string replace.
EDITAR: La cadena no está escrita, sino más bien una subcadena de otra pieza de código. 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.
Echa un vistazo a esta página: http://www.rishida.net/tools/conversion/
Pegue su código en el cuadro de texto superior (elimine primero las barras dobles).
El código es de código abierto: http://www.rishida.net/tools/conversion/conversionfunctions.js
No tengo suficientes representantes para poner esto en comentarios a las respuestas existentes:
unescape
solo está en desuso por trabajar con URI (o cualquier UDF-8 codificado), que probablemente sea el caso para las necesidades de la mayoría de las personas. encodeURIComponent
convierte una cadena js a UTF-8 escapado y decodeURIComponent
solo funciona en bytes UTF-8 escapados. Arroja un error para algo como decodeURIComponent(''%a9''); // error
decodeURIComponent(''%a9''); // error
porque ascii extendido no es válido utf-8 (aunque sigue siendo un valor unicode), mientras que unescape(''%a9''); // ©
unescape(''%a9''); // ©
Entonces necesitas saber tus datos cuando uses decodeURIComponent.
decodeURIComponent no funcionará en "%C2"
o en ningún byte solitario sobre 0x7f
porque en utf-8 indica parte de un sustituto. Sin embargo decodeURIComponent("%C2%A9") //gives you ©
Unescape no funcionaría correctamente en ese // ©
Y no arrojaría un error, por lo que unescape puede generar un código erróneo si no conoces tu datos.
Respuesta original:
unescape(JSON.parse(''"http//u00253A//u00252F//u00252Fexample.com"''));
> ''http://example.com''
Puede descargar todo el trabajo a JSON.parse
Editar (2017-10-12) :
@MechaLynx y @ Kevin-Weber observan que unescape()
está en desuso de los entornos que no son del navegador y no existe en TypeScript. decodeURIComponent
es un reemplazo decodeURIComponent
. Para una compatibilidad más amplia, use la siguiente información:
decodeURIComponent(JSON.parse(''"http//u00253A//u00252F//u00252Fexample.com"''));
> ''http://example.com''
Tenga en cuenta que el uso de unescape()
está en deprecated y no funciona con el compilador de TypeScript, por ejemplo.
En base a 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
ACTUALIZACIÓN : tenga en cuenta que esta es una solución que debería aplicarse a navegadores antiguos o plataformas que no sean de navegador, y se mantiene activa con fines educativos. Consulte la respuesta de @radicand a continuación para obtener una respuesta más actualizada.
Esta es una cadena unicode, escapada. Primero se escapó la cadena, luego se codificó con Unicode. Para convertir de nuevo 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: utilizo una expresión regular para buscar /u0025
. Sin embargo, dado que solo necesito una parte de esta cadena para mi operación de reemplazo, utilizo paréntesis para aislar la parte que voy a reutilizar, 0025
. Esta parte aislada se llama grupo.
La parte gi
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 debe ser insensible a mayúsculas y minúsculas. Esto podría 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. De forma útil, la operación de reemplazo de cadena 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 en la secuencia equivalente utf-8, luego uso la función incorporada de unescape
para decodificar la cadena a su forma apropiada.