KeroTools

Codificador y Decodificador de Entidades HTML

Codifica texto a entidades HTML seguras o decodifícalas, al instante — herramienta gratis para desarrolladores.

Entrada
0 caracteres
Salida

Tu texto se queda en tu equipo

Nada que borrar después

Seguro para datos reales de usuarios

Funciona en todo navegador moderno

Cómo funciona

  1. 1

    Pega tu texto

    Una cadena con corchetes angulares, un ampersand, comillas o letras acentuadas que debe ir dentro de marcado.

  2. 2

    Elige el contexto

    Texto, valor de atributo o codificación completa: cada uno escapa un conjunto distinto de caracteres.

  3. 3

    Copia el resultado

    Pégalo en una plantilla, un documento XML, un feed o el cuerpo de un correo.

Por qué usar esta herramienta

El contexto se elige, no se adivina

Escapar para texto, para un valor de atributo y para una URL son tres trabajos distintos, y eliges cuál.

La doble codificación se detecta

Se avisa si la entrada ya contiene entidades, para que no conviertas un ampersand dos veces seguidas.

Salida con nombre o numérica

Las referencias numéricas funcionan en XML, en feeds y en SVG, donde casi ninguna entidad con nombre existe.

Decodificación segura de ida y vuelta

Se reconocen las formas con nombre y numérica, incluida la escritura hexadecimal y las entidades sin punto y coma.

Honesto sobre lo que hace escapar

Hace un texto seguro de colocar en un contexto, algo más modesto que hacer seguro un marcado no fiable.

Nada sale del navegador

El texto se convierte en esta página, así que los tiques y nombres de cliente con los que pruebas siguen siendo tuyos.

No existe un único «escapar para HTML»: decide el contexto

Esta es la idea que hace comprensible todo lo demás. Un navegador analiza un documento en varios estados distintos, y los caracteres capaces de terminar el estado actual son diferentes en cada uno. Dentro del texto, solo `<` y `&` pueden empezar algo nuevo, así que son los dos que hay que escapar. Dentro de un valor de atributo entre comillas dobles, `<` es inofensivo y `"` es fatal, porque la comilla termina el atributo. Dentro de un valor de atributo sin comillas, lo termina un espacio, y también un tabulador, un salto de línea, una tilde invertida, un signo igual y un corchete angular de cierre. Dentro de un bloque `<script>`, escapar HTML no sirve absolutamente de nada y lo que hace falta es escapar cadenas de JavaScript. Por eso una única función `escape()` aplicada en todas partes produce a la vez salidas rotas y vulnerabilidades reales: escapa de más donde los caracteres eran seguros y de menos donde no lo eran. Elegir un contexto antes de codificar no es un detalle fino: es la decisión entera.

Solo un puñado de caracteres tiene que cambiar

Vale la pena saber lo corta que es la lista, porque casi todo el exceso de escapado viene de no saberlo. Los caracteres con significado sintáctico en HTML son `<`, `>`, `&`, `"` y el apóstrofo. De ellos, `&` siempre necesita escaparse porque empieza una entidad, y `<` siempre porque empieza una etiqueta. `>` es cortesía más que requisito dentro del texto —un navegador muestra un `>` suelto sin problema—, aunque escaparlo es costumbre en la mayoría de bases de código porque no cuesta nada y ayuda si el marcado lo procesa después algo más estricto. Las dos comillas importan solo dentro de valores de atributo, y solo la que usaste como delimitador. Todo lo demás, incluida cada letra acentuada, cada carácter árabe o chino y cada emoji, no necesita escaparse en absoluto en un documento UTF-8: la codificación ya se encarga. Convertir `café` en `caf&eacute;` es legal y casi siempre inútil, y hace tu archivo más grande y más difícil de buscar.

La eñe, los acentos y el hábito de escapar lo que no hace falta

Hay un patrón que aparece en proyectos en español más que en otros y conviene nombrarlo. Muchos sistemas antiguos —gestores de contenido, exportadores, plantillas de correo escritas cuando ISO-8859-1 era el valor por defecto— convertían ñ, á, é, í, ó, ú y ü en entidades con nombre, de modo que «Año» acababa escrito `A&ntilde;o` en la base de datos. Tenía sentido cuando no podías confiar en que la cabecera de codificación llegara intacta. Hoy es pérdida neta y por razones concretas: la búsqueda deja de funcionar, porque quien escribe «año» en el buscador no encuentra `A&ntilde;o`; la ordenación alfabética se rompe, porque se ordena por la `&` y no por la letra; el recuento de caracteres de un campo con límite miente, porque una letra ocupa ocho; y un lector de pantalla no puede pronunciar lo que aún no se ha decodificado. Hay además una trampa clásica en español: `&ntilde` sin punto y coma final se decodifica igual en HTML por compatibilidad, pero en XML es un error fatal, así que la misma cadena sobrevive en la web y revienta el feed. La solución correcta es declarar `<meta charset="utf-8">` y escribir las letras tal cual. Aquí la codificación completa existe como opción para cuando un sistema heredado te obliga, no como comportamiento por defecto.

La doble codificación es el fallo que esta herramienta existe para evitar

Escapar no es idempotente, y olvidarlo produce uno de los defectos más reconocibles de la web. Codifica `&` una vez y obtienes `&amp;`. Codifica el resultado otra vez y obtienes `&amp;amp;`, que se muestra en la página como el texto literal `&amp;`. Lo has visto: títulos de página que dicen «Tom &amp; Jerry», asuntos de correo con `&#39;` en mitad de una palabra, nombres de producto rodeados de `&quot;` en los resultados de búsqueda. Ocurre porque el escapado se aplicó en dos capas que no se conocían: un motor de plantillas que escapa automáticamente, más un controlador que escapó por precaución antes de entregar la cadena. El arreglo es no escapar nunca dos veces, y la manera de asegurarlo es escapar exactamente una vez, en el último momento posible, en el punto en que la cadena entra en el marcado. Todo lo que se guarde ya escapado en una base de datos acabará escapado otra vez por lo que lo muestre.

Las entidades con nombre son una función de HTML, no del texto

HTML5 define más de dos mil entidades con nombre, desde los familiares `&nbsp;` y `&copy;` hasta cosas como `&bigotimes;`. XML define exactamente cinco: `&lt;`, `&gt;`, `&amp;`, `&quot;` y `&apos;`. Esa brecha provoca un fallo concreto y frecuente. Mete `&nbsp;` en un feed RSS, un archivo SVG, un documento XHTML, un diseño de Android o una carga SOAP y obtienes un error de análisis, porque el analizador nunca ha oído hablar de ella y una entidad no definida es fatal en XML en vez de simplemente ignorarse. La forma numérica `&#160;` funciona en todas partes, porque no necesita definición. Hay una trampa simétrica: `&apos;` es una de las cinco de XML pero no existía en HTML4, así que documentos HTML antiguos y algunos clientes de correo la muestran como texto literal. Si una cadena puede viajar entre formatos —y en una pila moderna casi todas lo hacen—, las referencias numéricas son la grafía segura.

Escapar no es sanear, y la diferencia importa

Estos dos se confunden constantemente, y en esa confusión viven los fallos de inyección. Escapar toma un texto y lo hace seguro de colocar en un contexto concreto, para que se muestre en lugar de interpretarse. Sanear toma marcado que debe seguir siendo marcado y le quita las partes peligrosas. Escapar un comentario antes de imprimirlo es correcto; escapar un campo de texto enriquecido que el usuario tiene permiso para formatear destruye el formato, y la respuesta habitual —dejar pasar el HTML sin escapar— es lo que de verdad abre el agujero. El ejemplo más afilado de la diferencia es una URL: codifica un enlace con entidades y `javascript:alert(1)` sobrevive completamente intacto, porque la decodificación de entidades ocurre antes de comprobar el esquema, así que `&#106;avascript:` vuelve a ser `javascript:` y se ejecuta. Ninguna cantidad de escapado HTML protege un `href`; solo validar el esquema lo hace. Escapar resuelve exactamente un problema, y saber cuál es la clave.

Errores comunes que conviene evitar

  • Usar una sola función de escapado en todas partes. Texto, valores de atributo y bloques de script terminan en caracteres distintos, así que una única función escapa de más en un sitio y de menos en otro.
  • Escapar la misma cadena dos veces. Escapar no es idempotente: `&` pasa a `&amp;` y luego a `&amp;amp;`, y por eso hay títulos que dicen «Tom &amp; Jerry».
  • Guardar ñ y acentos como entidades en la base de datos. Rompe la búsqueda y la ordenación; la solución es `<meta charset="utf-8">` y escribir las letras tal cual.
  • Meter entidades con nombre en XML. Allí solo hay cinco definidas, así que `&nbsp;` es un error fatal en un feed, un SVG o un XHTML, mientras que `&#160;` funciona en todas partes.
  • Confiar en que codificar entidades hace segura una URL. Las entidades se decodifican antes de comprobar el esquema, así que `&#106;avascript:` vuelve a ser `javascript:` y se ejecuta.

Comparativa

AspectoEsta herramientaCodificadores onlineUna biblioteca del lenguaje
Texto enviado a un servidorNuncaNormalmente síNo
Te deja elegir el contextoRara vezNormalmente
Avisa de la doble codificaciónNoNo
Salida numérica para XMLA vecesConfigurable
Decodifica todo el conjunto HTML5ParcialmenteNormalmente
PrecioGratisGratis / planes de pagoGratis

Características

Codificar y decodificar

Ambas direcciones, para revisar lo que produjo un sistema con la misma facilidad con que preparas lo que envías.

Codificación mínima o completa

Escapa solo los caracteres que exige el contexto, o todo carácter no ASCII, según a dónde vaya el texto.

Soporte de entidades con nombre

Al decodificar se reconoce todo el conjunto con nombre de HTML5, incluida la larga cola que nadie escribe a mano.

Hexadecimal y decimal

Las referencias numéricas se leen y se escriben en ambas grafías, porque los documentos reales llevan las dos.

Detección de doble codificación

Las entidades ya presentes en la entrada se resaltan antes de que las codifiques por segunda vez.

Entradas grandes admitidas

Una plantilla entera o una exportación larga se convierte sin subida ni tope de tamaño.

Nada que instalar

Sin herramienta de compilación, sin entorno de ejecución, sin dependencias: funciona en la página web.

Listo para árabe y RTL

Interfaz completa en ocho idiomas, incluido el árabe de derecha a izquierda.

Seguro por defecto

Servido por HTTPS, sin rastreo de contenido ni subida a terceros.

Quién la usa

Desarrolladores web

Comprobar cómo se comportará una cadena una vez dentro de un valor de atributo.

Desarrolladores de email

Preparar asuntos y cuerpos de mensaje para clientes que analizan de forma estricta.

Redactores técnicos

Mostrar ejemplos de código en una página sin que el navegador intente ejecutarlos.

Quien depura texto corrupto

Decodificar una cadena que llegó con `&amp;amp;` en mitad de ella.

Preguntas Frecuentes

No. Todo se ejecuta localmente en tu navegador — tu texto nunca se sube, guarda ni comparte.

Sí — totalmente gratis, sin cuenta y sin límites.