2008-11-08 10 views
9

Tengo un problema al mostrar una cadena Javascript con secuencias de escape de caracteres Unicode incrustadas (\ uXXXX) donde el carácter "\" inicial se escapó como "& # 92;" ¿Qué debo hacer para transformar la cadena para que evalúe correctamente las secuencias de escape y produzca resultados con el carácter Unicode correcto?Problema Unicode de doble escape Javascript

Por ejemplo, yo estoy ocupando de entrada como:

"this is a \u201ctest\u201d";

intentar decodificar el "& # 92;" utilizando una expresión expresiones regulares, por ejemplo:

var out = text.replace('/\/g','\');

resultados en el texto de salida:

"this is a \u201ctest\u201d";

es decir, las secuencias de escape Unicode se muestran como secuencias de escape reales, no los caracteres de comillas dobles Me gustaría.

Respuesta

0

No estoy seguro de si esto es así, pero la respuesta podría tener algo que ver con eval(), si puede confiar en su entrada.

+2

eval casi nunca es la respuesta correcta. –

0

Estaba pensando en la misma línea, pero el uso de eval() en todos los sentidos podía dar como resultado la misma salida escapada; por ejemplo,

eval(new String("this is a \u201ctest&#amp;92;u201d"));

o incluso

eval(new String("this is a \u201ctest&#amp;92;u201d".replace('/\/g','\')));

todos los resultados en lo mismo:

"this is a \u201ctest\u201d";

Es como si lo que necesito para obtener el motor de Javascript de alguna manera volver a evaluar o re analizar la cadena, pero no sé qué lo haría. Pensé que tal vez eval (o simplemente crear una nueva cadena utilizando la entrada correctamente escapada lo haría, pero ahora la suerte.

La cuestión fundamental es - lo que tengo que hacer para convertir la cadena dada:

"this is a \u201ctest&#amp;92;u201d"

en una cadena que utiliza los caracteres Unicode correctos?

6

Como resultado, es unescape() que queremos, pero con '% uXXXX' en lugar de '\ uXXXX':

unescape (yourteststringhere.sustituir (/ & # 92;/g, '%'))

+0

No creo que esto funcione en general; unescape es para URLs que no manejan caracteres Unicode multibyte. –

+0

¿El hecho de que hay 4 X's no indica multibytedness? ;) En cualquier caso, me funciona en FF3: var yourteststringhere = "Ein sch \ u00F6nes Beispiel eines mehrsprachigen Textos: \ u65E5 \ u672C \ u8A9E"; – Kev

+0

Y FF2, podría agregar. – Kev

1

Ésta es una solución terrible, pero se puede hacer esto:

var x = "this is a \u201ctest\u201d".replace(/\/g,'\\') 
// x is now "this is a \u201ctest\u201d" 
eval('x = "' + x + '"') 
// x is now "this is a “test”" 

Es terrible porque:

  • eval puede ser peligroso, si no sabe lo que hay en la cadena

  • la cadena que se cita en la declaración eval se romperá si tiene comillas reales en su cadena

+0

aún así no recomendaría este enfoque, pero podría hacerlo más seguro así: 'eval ('x ="' + x.replace (/ \/g, '\\'). Replace (/ ([^ \ \]) "/ g, '$ 1 \\"') + '"')' – Kip

+0

espera, eso aún podría romperse de otras formas. tienes razón, esta es una solución terrible. dándole el +1 todavía porque explica claramente que es una solución terrible y explica por qué. – Kip

1

¿Estás seguro de que '\' es el único personaje que podría escapar de HTML? ¿Estás seguro de que '\ uXXXX' es el único tipo de escape de cuerda en uso?

De lo contrario, necesitará un carácter HTML/entidad-referencia-decodificador de propósito general y JS-string-literal-decodificador. Desafortunadamente JavaScript no tiene métodos incorporados para esto y es bastante tedioso hacerlo manualmente con una carga de expresiones regulares.

Es posible tomar ventaja de HTML-decodificador del navegador mediante la asignación de la cadena a innerHTML la propiedad de un elemento, y luego pedir JavaScript para decodificar la cadena que el anterior:

var el= document.createElement('div'); 
el.innerHTML= s; 
return eval('"'+el.firstChild.data+'"'); 

Sin embargo, este es un increíblemente fea hackeo y un agujero de seguridad si la cadena proviene de una fuente que no es 100% confiable.

¿De dónde vienen las cuerdas? Sería mejor tratar el problema en el extremo del servidor donde es posible que tenga funciones de manejo de texto más potentes disponibles. Y si pudieras arreglar lo que sea que sea innecesariamente escapando de HTML tus barras invertidas podrías encontrar el problema arreglado por sí mismo.

Cuestiones relacionadas