Codificador y decodificador de entidades HTML
Escapa los caracteres que de otro modo se leerían como marcado, o decodifica una cadena que llegó llena de & y ’. Los emoji y los demás caracteres por encima de U+FFFF salen como una sola entidad, no como dos mitades rotas.
La primera opción escapa cinco caracteres y deja tus acentos y rayas como texto real, que es lo que quieres en una página UTF-8.
Solo se usa cuando no hay una entidad con nombre para el carácter. Las dos se entienden en todas partes.
Tres formas de escribir el mismo carácter
Una referencia de entidad es una manera de escribir un carácter usando solo ASCII simple. Hay tres formas y los navegadores las tratan de manera idéntica: con nombre (&), decimal (&) y hexadecimal (&). Las tres producen un ampersand. Las referencias con nombre se leen bien; las numéricas siempre existen, incluso para los caracteres que nadie se molestó en nombrar.
En realidad solo necesitas cinco
En una página que declara <meta charset="utf-8"> puedes escribir una raya, una letra acentuada o un emoji directamente en el código fuente y se va a ver bien. Lo que no puedes escribir directamente es cualquier cosa que el analizador leería como marcado:
&— siempre, en todas partes. Un ampersand sin escapar seguido de letras puede quedar absorbido como una entidad, así queTom & Jerryno es pedantería opcional.<— siempre dentro del contenido de texto. Es lo que empieza una etiqueta.>— por convención más que por necesidad, pero escaparlo no cuesta nada y evita sorpresas en los casos límite."y'— dentro de los valores de atributo, la que hayas usado como comilla. Escapar las dos significa que nunca tienes que pensar en cuál era.
Escapa esos cinco y el texto queda seguro en los nodos de texto HTML y en los atributos entrecomillados. Eso es lo que hace el primer modo de arriba. Los otros dos modos existen para cuando no puedes confiar en la codificación de todos los sistemas por los que va a pasar un archivo.
Por qué el apóstrofo sale como un número
Esta herramienta escribe ' en lugar de '. La forma con nombre está definida en XML y en HTML5, pero no formaba parte de HTML 4, así que los analizadores viejos y una cantidad sorprendente de clientes de correo la muestran como el texto literal '. La referencia numérica funcionó siempre. Son cuatro caracteres más y una cosa menos que depurar.
Escapar no es sanitizar, y el contexto lo decide todo
El escape de cinco caracteres es correcto para el texto HTML y para los valores de atributo entrecomillados. No es correcto, ni seguro, en ningún otro lado:
- Atributos sin comillas.
<div class=VALOR>termina en el primer espacio, así que escapar las comillas no te sirve de nada. Pon comillas en tus atributos. - Dentro de
<script>. Eso es un contexto de cadena de JavaScript. Ahí las referencias de entidad no se decodifican, y la secuencia</script>dentro de una cadena va a cerrar el bloque de todos modos. - Dentro de un atributo de URL. Las entidades se decodifican antes de que se analice la URL, así que
javascript:alert(1)sobrevive intacto al escape de entidades y se convierte en un enlacejavascript:. Valida el esquema; no confíes en el escape. - Dentro de CSS. Otra vez, reglas de escape distintas.
Y escapar no es eliminar. Esta herramienta hace que el marcado se muestre como texto. No elimina nada peligroso, porque no le hace falta: nada sobrevive como marcado. Si quieres conservar algunas etiquetas y descartar otras, eso es sanitizar, y necesita un analizador con una lista de etiquetas permitidas.
Emoji, pares sustitutos y esa salida rota que ya viste
Los caracteres por encima de U+FFFF —emoji, CJK poco frecuente, casi todas las escrituras históricas— se guardan en JavaScript como dos unidades de código. Un escapador que recorre una cadena índice por índice emite dos referencias inútiles como ��, que ningún analizador puede volver a armar en el carácter original. Esta herramienta itera por punto de código, así que una cara sonriente se convierte en la única referencia 😀.
Lo que el decodificador hace y lo que no
Aquí se decodifica con el propio analizador de HTML del navegador, lo que significa que se siguen las reglas de HTML5, incluidas las heredadas. HTML5 decodifica una lista de alrededor de cien entidades antiguas incluso sin el punto y coma final, así que © se convierte en un signo de copyright. Un analizador de XML rechazaría eso de plano. Si estás llevando contenido de ida y vuelta por RSS, SVG o un archivo de configuración XML, recuerda que XML define exactamente cinco entidades con nombre —amp, lt, gt, quot y apos— y todo lo demás tiene que ser numérico.
Dos límites más que conviene conocer. Las referencias que no se reconocen pasan sin cambios en lugar de provocar un error, exactamente como las mostraría un navegador, así que una errata en el nombre de una entidad es invisible aquí. Y los caracteres de control por debajo de U+0020 se dejan como están en todos los modos, porque las referencias numéricas a la mayoría de ellos no son HTML válido: si tu texto los contiene, el problema está antes del escape.
Preguntas frecuentes
¿Qué caracteres tengo que escapar en HTML?
El ampersand y el signo menor que siempre, el mayor que por convención, y la comilla que hayas usado alrededor de un valor de atributo. Escapar los cinco cubre los nodos de texto y los atributos entrecomillados, que es donde ocurre casi toda la inyección de HTML.
¿Todavía hacen falta entidades para los caracteres acentuados?
No, no en una página UTF-8, que hoy son todas. Escríbelos directamente. Las entidades siguen siendo útiles para los caracteres invisibles o ambiguos en el código fuente, como un espacio de no separación o un guion suave.
¿Por qué esto escribe ' en lugar de '?
Porque ' nunca formó parte de HTML 4. Funciona en HTML5 y en XML, pero los analizadores viejos y varios clientes de correo lo muestran como texto literal. La forma numérica funciona en todos lados.
¿Alcanza con escapar el HTML para prevenir XSS?
Solo en el texto HTML y en los valores de atributo entrecomillados. No hace nada dentro de un bloque script, dentro de un atributo de URL ni en CSS: una URL javascript: sobrevive intacta al escape de entidades. Escapa según el contexto en el que realmente estás escribiendo.
¿Por qué un emoji se convierte en una entidad aquí y en dos en otro lado?
Porque los emoji están por encima de U+FFFF y JavaScript los guarda como dos unidades de código. Las herramientas que recorren los índices de la cadena emiten dos referencias rotas. Esta itera por punto de código y emite una sola referencia correcta.
Última actualización 19 de septiembre de 2026