TextSorter
0 caracteres

Qué es una entidad HTML y cómo se escribe

Una entidad HTML es una secuencia de texto que representa un carácter que, escrito tal cual, el navegador interpretaría como parte de la sintaxis del propio HTML en vez de como contenido visible. Existen dos formas de escribir una entidad. La primera es la entidad con nombre, que empieza con un símbolo de ampersand (&) y termina con un punto y coma (;), por ejemplo &lt; para representar el carácter <. La segunda es la entidad numérica, que usa el código Unicode del carácter en vez de un nombre memorizable, ya sea en base decimal como &#60; o en base hexadecimal como &#x3C;, ambas representando exactamente el mismo carácter <.

Esta herramienta hace ambas conversiones. El botón Codificar HTML toma texto plano y reemplaza cada carácter que tiene significado especial en HTML por su entidad correspondiente, dejándolo listo para mostrarse tal cual dentro de una página sin que el navegador lo malinterprete. El botón Decodificar HTML hace el camino inverso: toma un texto lleno de entidades y las convierte de vuelta a los caracteres originales, útil cuando recibes contenido ya codificado y necesitas leerlo o procesarlo como texto normal.

Qué caracteres hay que escapar y por qué

El analizador HTML de un navegador le da un significado especial a un puñado de caracteres, y por eso no pueden aparecer sueltos dentro del contenido de una página sin generar resultados inesperados. Los más importantes son estos cinco:

El caso más habitual donde esto genera problemas reales es al mostrar un fragmento de código dentro de una página web, algo muy común en tutoriales, documentación técnica o comentarios de blog. Si pegas literalmente <div class="tarjeta"> dentro del cuerpo de un artículo sin escaparlo, el navegador no muestra ese texto, intenta interpretarlo como una etiqueta real. El resultado es un <div> vacío e invisible incrustado en tu artículo en vez del código de ejemplo que querías que el lector viera. Para que ese fragmento aparezca como texto visible, tiene que convertirse primero en &lt;div class=&quot;tarjeta&quot;&gt;, que el navegador sí muestra tal cual, como texto plano, en vez de ejecutarlo como marcado.

Lo mismo pasa con un ampersand suelto. Un texto tan inocente como "Café y Bar, todo & más" contiene un carácter que el analizador intenta leer como el inicio de una entidad. Dependiendo del navegador y de lo que venga después, esto puede renderizarse de forma inconsistente o directamente romper el resto del documento. Escribirlo como "Café y Bar, todo &amp; más" elimina cualquier ambigüedad.

Entidades con nombre frente a entidades numéricas

Tomemos el símbolo de menor que como ejemplo: se puede escribir como &lt;, como &#60; o como &#x3C;, y las tres producen exactamente el mismo carácter < en el navegador. La diferencia entre ellas es puramente de legibilidad y de compatibilidad, no de resultado visual.

FormaEjemploCuándo conviene
Con nombre&lt;, &amp;, &copy;Código que otras personas van a leer y mantener; el nombre explica qué carácter representa sin tener que buscarlo
Numérica decimal&#60;, &#169;Cuando el carácter no tiene una entidad con nombre ampliamente soportada, o cuando el HTML se genera de forma programática
Numérica hexadecimal&#x3C;, &#xA9;Cuando ya trabajas con el valor Unicode del carácter en hexadecimal, por ejemplo al procesar texto en un lenguaje de programación

Las entidades con nombre existen para los caracteres más comunes, como &lt;, &gt;, &amp;, &copy; o &nbsp;, y son la opción más legible cuando alguien más tiene que leer tu código fuente. Sin embargo, no todos los caracteres Unicode tienen una entidad con nombre definida en el estándar HTML. Las entidades numéricas, en cambio, funcionan para cualquier carácter Unicode existente, lo que las convierte en la opción universal cuando generas HTML de forma automática desde un script, o cuando necesitas representar un carácter poco común que no tiene un nombre asignado. Por eso muchas librerías que generan HTML de forma programática prefieren la forma numérica: no tienen que mantener una tabla de nombres, solo convertir el código de carácter directamente.

Las cinco entidades predefinidas de XML y su relación con HTML

La especificación XML, de la que deriva XHTML, define exactamente cinco entidades como obligatorias para cualquier documento válido: &lt;, &gt;, &amp;, &quot; y &apos;. Un analizador XML es estricto: si alguno de estos cinco caracteres aparece sin escapar donde no corresponde, el documento entero se considera inválido y muchos analizadores se niegan directamente a procesarlo.

HTML es bastante más permisivo. Un navegador procesando HTML normal, no XHTML, tolera un apóstrofo suelto dentro del texto del cuerpo del documento sin quejarse, porque el apóstrofo no tiene un significado sintáctico especial fuera de un atributo delimitado por comillas simples. Esa es una diferencia práctica importante: escribir un texto con un apóstrofo literal funciona perfectamente en una página HTML normal, mientras que el mismo documento interpretado como XHTML estricto técnicamente debería llevar ese apóstrofo escapado como &apos; para ser válido.

En la práctica, la mayoría de proyectos web modernos no generan XHTML estricto, así que estas cinco entidades funcionan como una buena práctica general más que como una obligación técnica. Aun así, seguir la regla más estricta de las cinco entidades XML, incluso al escribir HTML normal, es una forma sencilla de que tu código sea válido sin importar en qué contexto termine reutilizándose, ya sea una página HTML, un feed RSS, un archivo SVG o cualquier otro formato basado en XML.

Espacios de no ruptura y caracteres tipográficos habituales

Más allá de los caracteres reservados de la sintaxis, existe un grupo de entidades que se usa por razones puramente tipográficas: representar caracteres que son difíciles de escribir directamente desde el teclado, o que requieren un comportamiento especial en el navegador.

Todas estas entidades resuelven el mismo problema de fondo: hay caracteres que no están disponibles en un teclado estándar, o que dependen de que el archivo esté guardado con la codificación correcta para mostrarse bien. Escribirlos como entidades garantiza que se vean igual sin importar cómo esté configurado el editor de texto, el sistema operativo o la codificación del archivo donde vive el HTML.

Escapar en atributos frente a escapar en el texto del cuerpo

No todos los contextos dentro de un documento HTML necesitan escapar los mismos caracteres. Dentro del texto visible del cuerpo de la página, lo esencial es escapar < y &, porque son los caracteres que el analizador interpreta como el inicio de una etiqueta o de una entidad. Dentro del valor de un atributo delimitado por comillas dobles, en cambio, el carácter crítico es la comilla doble misma, porque es lo que le indica al navegador dónde termina el valor del atributo.

Un ejemplo concreto lo deja claro. Imagina un atributo title que necesita mostrar una frase con comillas dentro, algo como un tooltip que dice: la política se llama "Entrega Rápida". Si escribes ese atributo así, sin escapar nada:

<span title="la política se llama "Entrega Rápida"">pasa el mouse aquí</span>

El navegador lee la primera comilla doble después de "llama" como el cierre del atributo title, dejando el resto de la frase suelta como texto inválido fuera del atributo. La forma correcta es escapar únicamente las comillas dobles internas con &quot;:

<span title="la política se llama &quot;Entrega Rápida&quot;">pasa el mouse aquí</span>

Ahora el navegador identifica correctamente dónde empieza y dónde termina el valor completo del atributo. Esta misma lógica se aplica a cualquier atributo que reciba texto dinámico, como alt en una imagen, placeholder en un campo de formulario o cualquier atributo data-*. Si el valor puede contener una comilla, tiene que escaparse antes de insertarse en el atributo, sin importar si el resto del texto necesita también escapar < o &.

La razón de seguridad: por qué escapar protege contra inyección de código

Escapar texto antes de mostrarlo en una página no es solo una cuestión estética, es la defensa más básica contra ataques de Cross-Site Scripting, conocidos como XSS. El problema aparece cada vez que una aplicación toma texto escrito por un usuario, como un comentario, una reseña o un campo de un formulario, y lo inserta directamente en el HTML de la página sin pasar por un proceso de escape.

Imagina un campo de comentarios de un blog que muestra el texto exactamente como lo escribió cada visitante, sin ninguna transformación. Si alguien escribe un comentario que contiene <script>robarDatos()</script>, y ese texto se inserta sin escapar en la página, el navegador de cualquier otra persona que visite esa entrada del blog no ve el texto del script, lo ejecuta como si fuera parte legítima del sitio. Dependiendo de qué haga ese script, esto puede robar cookies de sesión, redirigir a páginas fraudulentas, o modificar el contenido visible de la página para engañar a quien la visita.

La defensa es exactamente el proceso que hace esta herramienta: convertir < en &lt; antes de insertar cualquier texto de origen externo en el HTML de una página. Con el texto correctamente escapado, ese mismo comentario aparece en pantalla como una cadena de texto inofensiva, &lt;script&gt;robarDatos()&lt;/script&gt; convertido de vuelta a texto visible, en vez de ejecutarse como código. El navegador nunca llega a interpretar esos caracteres como el inicio de una etiqueta real, porque la entidad ya le indica explícitamente que se trata de texto, no de marcado.

Esta es la razón por la que prácticamente todos los frameworks modernos, desde React hasta Vue, escapan automáticamente cualquier valor dinámico que insertan en el DOM, salvo que el desarrollador use explícitamente una función marcada como insegura para insertar HTML crudo. Escapar por defecto y solo permitir HTML sin escapar de forma deliberada y consciente es la práctica estándar de la industria para evitar este tipo de vulnerabilidad.

Preguntas Frecuentes

¿Qué es exactamente una entidad HTML?
Es una secuencia de texto que representa un carácter que, escrito tal cual, el navegador interpretaría como parte del código HTML en vez de como contenido visible. Empieza con un ampersand y termina con un punto y coma, como en el ejemplo del carácter menor que.
¿Por qué necesito codificar HTML antes de mostrarlo?
Porque un navegador interpreta ciertos caracteres, como el signo de menor que y el ampersand, como parte de la sintaxis del propio HTML. Si no los codificas, el navegador puede intentar renderizarlos como una etiqueta real en vez de mostrarlos como texto, o directamente romper el resto del documento.
¿Cuál es la diferencia entre codificar y decodificar?
Codificar convierte caracteres especiales, como el signo de menor que, en su forma de entidad segura, algo como el equivalente de menor que en formato de entidad. Decodificar hace exactamente el proceso inverso: toma un texto lleno de entidades y devuelve los caracteres originales legibles.
¿Escapar el texto cambia cómo se ve en la página renderizada?
No, siempre que el escape se haga correctamente. Un navegador convierte la entidad de vuelta al carácter visual correspondiente al renderizar la página, así que el resultado final que ve la persona visitante es idéntico al texto original, solo que el marcado subyacente queda seguro.
¿Mi texto es privado al usar esta herramienta?
Sí. Toda la codificación y decodificación ocurre completamente dentro de tu navegador mediante JavaScript. Ningún texto se sube ni se procesa en ningún servidor externo.
¿Las reglas de escape son las mismas en HTML que en XML?
No exactamente. XML exige escapar cinco caracteres específicos en cualquier documento válido, incluyendo el apóstrofo. HTML es más flexible y tolera un apóstrofo suelto en el texto del cuerpo del documento, aunque escaparlo de todas formas nunca genera un error.

Herramientas de Desarrollo Relacionadas

🔒 100% Privado y Seguro

Toda la codificación y decodificación HTML ocurren <strong>completamente en tu navegador</strong>. Ningún texto o código se sube jamás a ningún servidor. Tus fragmentos permanecen en tu dispositivo en todo momento.