🪢 Escape / Unescape de Cadenas
Convierte cadenas entre entidades HTML, JavaScript, JSON, escapes Unicode (\uXXXX) y URL.
📖 Ejemplos
| Format | Raw | Escaped |
|---|---|---|
| HTML | <a> | <a> |
| JS | It's 'ok' | It\'s \'ok\' |
| JSON | tab here | tab\there |
| Unicode | 日本語 | \u65e5\u672c\u8a9e |
| URL | a b&c | a%20b%26c |
🔗 Herramientas relacionadas
📖 Dónde se suele tropezar
Escapa y desescapa cadenas en catorce formatos: entidades HTML, cadenas de JavaScript, JSON, Unicode (\uXXXX), URL, CSV, SQL, expresiones regulares, shell y mas. Todo se ejecuta en el navegador. Ahora bien, escapar no es "transformar una cadena" sino "ajustarse a la gramatica del destino": esta herramienta no conoce tu destino, de modo que no puede decidir que formato debes elegir. Y aplicar el formato equivocado da un resultado peor que no hacer nada, porque produce sensacion de seguridad sin proteger nada.
| Caso | Qué ocurre | Qué hacer |
|---|---|---|
| Un contexto distinto exige un escape distinto | El mismo valor requiere un tratamiento distinto segun donde acabe. Dentro de un <div> basta con codificar entidades; dentro de href="..." ademas debe ser valido como URL; y dentro de onclick="..." tiene que satisfacer a la vez la capa de JavaScript y la de HTML. Hay incluso contextos donde escapar HTML no sirve de nada: un valor que empiece por javascript: en un href se ejecuta igualmente tras codificar entidades, y dentro de <style> o <script>, < se trata como texto literal mientras la sintaxis sigue abierta. Dicho de otro modo: hay lugares donde "escapa el HTML y sigue" no aplica. |
Escapa en el momento de la salida y deja que lo haga el motor de plantillas. Lo correcto es usar un mecanismo en el que puedas nombrar el contexto: |e('html_attr'), |e('js') y |e('url') en Twig, JSX en React, html/template en Go. Descarta cualquier diseno que escape en la entrada y guarde la forma escapada: un valor almacenado rara vez tiene un unico destino, pues acaba en cuerpos de correo, exportaciones CSV y JSON de API por igual. Guarda siempre el valor en bruto y escapalo segun el contexto local cada vez que lo emitas. Ese unico principio elimina casi todo lo anterior. Usa esta herramienta como el sitio donde comprobar a ojo si el resultado es correcto. |
Doble escape (&lt; aparece en pantalla) |
Es cuando en pantalla se ve tal cual <strong> o un & suelto. La causa es casi siempre que el valor se escapo dos veces, clasicamente porque la aplicacion escapa al guardar y el motor de plantillas vuelve a escapar al mostrar. Lo desagradable es lo bien que se esconde: con datos formados solo por letras y digitos no pasa nada, y solo salen rotas las filas con un apostrofo o un & en el nombre. Ademas, los datos corruptos ya estan en la base de datos, de modo que arreglar la vista no los arregla. Tambien existe el accidente inverso: un \n de JSON se escapa una segunda vez y se convierte en \\n, de modo que lo que debia ser un salto de linea llega como dos caracteres visibles. |
Primero determina en que lado se esta duplicando. Pega aqui el valor tal como esta en la base de datos y elige la direccion de desescape con HTML. Si el valor cambia, ya estaba escapado cuando se guardo: la causa esta en la entrada. Si no cambia, la duplicacion ocurre al mostrar. Reparalo con una migracion de una sola pasada y acota siempre el objetivo (WHERE body LIKE '%&%'). Aplicar html_entity_decode sin condiciones a todas las filas destruira aquellas que legitimamente querian decir &. Haz una copia de seguridad y cuenta las filas afectadas antes de ejecutarla. |
| Escapar no es sanear | Escapar HTML es un procedimiento para mostrar algo con seguridad como texto, no para renderizar con seguridad el HTML que escribio un usuario. Donde si quieras permitir etiquetas, como en publicaciones de texto enriquecido, hace falta un saneador con una lista explicita de etiquetas y atributos permitidos. El mismo malentendido reaparece en otros formatos. Escapar una cadena SQL ('') no sustituye a los parametros: los nombres de tabla y columna, la direccion en ORDER BY y los comodines % y _ de LIKE quedan todos fuera de lo que cubre el escape de cadenas. Con el shell pasa igual: las comillas no impiden que un valor como -rf se interprete como una opcion. |
Cambia de herramienta segun el objetivo. Si permites etiquetas, usa un saneador especializado (HTML Purifier en PHP, DOMPurify en JS) y no intentes eliminar etiquetas con una expresion regular propia: los intentos caseros en esa direccion se rompen sin excepcion. Para SQL usa siempre parametros y, para las partes que no se pueden vincular, como nombres de tabla u orden de clasificacion, cotejalas contra una lista blanca (acepta solo valores presentes en ['name','created_at']). Para el shell, usa una API que pase los argumentos como array (la familia execve, o subprocess.run([...]) en Python) y coloca -- antes de la entrada del usuario para cortar el analisis de opciones. |
Los escapes Unicode esconden una trampa fuera del BMP. \uXXXX solo puede expresar dieciseis bits, de modo que los emoji y algunos caracteres han se parten en un par suplente: un emoji se convierte en las dos unidades \ud83d\ude00. Contar caracteres o truncar en ese punto parte un caracter por la mitad y lo corrompe. Desde ES6 puedes usar la forma unica \u{1f600}. Hay una segunda consecuencia: esa costumbre de convertir lo no ASCII en \uXXXX entorpece la verificacion. Este mismo sitio concluyo dos veces que un despliegue habia fallado porque buscaba con grep el texto japones que la plantilla habia escapado para JS. El procedimiento correcto es decodificar \uXXXX antes de buscar. Y una ultima regla: no entregues nunca una cadena desescapada a ninguna via de ejecucion que no sea JSON.parse, y jamas a eval. Decodificar es una operacion de inspeccion, no de ejecucion.
📖 Cómo usar
-
1
Elegir formato y direcciónSelecciona el formato y la dirección (escape o unescape).
-
2
Ingresar textoPega o escribe texto en el campo izquierdo. La conversión ocurre en tiempo real.
-
3
Copiar o intercambiar resultadoCopia el resultado o usa el botón intercambiar para convertir en sentido inverso.
❓ Preguntas frecuentes
¿Cuál es la diferencia entre escape HTML y codificación URL?
¿Puede escapar caracteres no ASCII como el japonés?
¿Se puede usar para prevenir inyección SQL?
🐛 ¿Encontró un problema con esta herramienta?
Gratis, sin registro. Incluso solo los pasos para reproducir ayudan. Los informes van directamente al operador y se usan para corregir.
¡Gracias por tu reporte!
Tu reporte llegó al operador y se usará para mejorar.