En HTML, los caracteres <, > y & tienen un significado especial y deben escaparse, pero el español añade su propio conjunto de casos particulares: signos de apertura invertidos, la eñe y una historia de codificaciones que todavía deja huella en formularios antiguos.
Los signos de apertura: ¿ y ¡
El español es de los pocos idiomas que abre las preguntas y exclamaciones con un signo invertido: ¿ (¿) y ¡ (¡). En teclados o sistemas que no los tienen mapeados fácilmente —terminales, formularios heredados, ciertos generadores de PDF— la entidad numérica o con nombre sigue siendo la forma más fiable de garantizar que aparezcan, en vez de depender de que el teclado del editor tenga la tecla correspondiente.
La eñe y las vocales acentuadas
Palabras como "año" o "mañana" dependen de la eñe (ñ), y prácticamente cualquier texto en español necesita vocales con tilde: á, é, í, ó, ú. Con UTF-8 ya no hace falta escaparlas para que se muestren, pero siguen apareciendo en feeds RSS, exportaciones CSV o plantillas de correo heredadas que se generaron en épocas de ISO-8859-1, donde un acento sin escapar podía convertirse en un carácter ilegible.
Entidades con nombre y numéricas
Una entidad HTML se puede escribir de dos formas: con un código con nombre (<, &, ") o numérico (<, &, o en hexadecimal <). El navegador las muestra igual en ambos casos: las con nombre suelen ser más fáciles de leer, mientras que las numéricas cubren cualquier carácter Unicode, incluso sin nombre propio.
El conjunto mínimo de caracteres a escapar
<→<— para que no empiece una etiqueta.>→>— para cerrar correctamente el texto tras una etiqueta.&→&— para que el símbolo & no se interprete como el inicio de otra entidad."y'→",'— obligatorio dentro de atributos entre comillas.
La relación con el XSS
La mayoría de las vulnerabilidades XSS ocurren precisamente porque el texto introducido por el usuario se inserta en HTML sin escapar. Si se muestra "<script>...</script>" sin convertirlo a entidades, el navegador lo ejecutará como código. Escapar es una medida básica —aunque no la única— al mostrar contenido dinámico.
El contexto importa: texto frente a atributo
Escapar <, > y & es suficiente para el texto entre etiquetas, pero dentro de un atributo entre comillas también hay que escapar específicamente el tipo de comilla usado, sea doble o simple. Si el atributo está delimitado por comillas dobles y el valor contiene una comilla doble sin escapar, el marcado se «romperá» antes de lo esperado.