Acerca de este problema HTML
El rango de controles C1 abarca los puntos de código Unicode U+0080 hasta U+009F (decimal 128–159). Estos son caracteres de control heredados de estándares de codificación más antiguos, y la especificación HTML prohíbe explícitamente las referencias de carácter numérico que se resuelvan a ellos. Cuando el validador W3C encuentra una referencia como — (decimal 151, que es U+0097), la marca porque estos puntos de código no son caracteres de contenido válidos.
Por qué sucede esto
Este problema casi siempre surge de una confusión entre la codificación de caracteres Windows-1252 (o CP-1252) y Unicode. Windows-1252 es una codificación heredada que reutiliza el rango de bytes 0x80–0x9F para almacenar caracteres útiles como comillas curvadas, rayas largas y el símbolo del euro. En Unicode, sin embargo, esas mismas posiciones de puntos de código están reservadas como caracteres de control C1 y no tienen significado imprimible.
Cuando el texto codificado originalmente en Windows-1252 se convierte a referencias numéricas HTML byte por byte — sin el re-mapeo apropiado a Unicode — terminas con referencias como ” en lugar del correcto ” para una comilla doble derecha. El valor del byte tenía significado en Windows-1252, pero el punto de código Unicode correspondiente es un carácter de control.
Por qué es importante
- Cumplimiento de estándares: La especificación HTML prohíbe estas referencias. Los navegadores pueden manejarlas de manera inconsistente, algunos las re-mapean silenciosamente y otros las ignoran completamente.
- Portabilidad: Aunque algunos navegadores aplican el re-mapeo de Windows-1252 como una peculiaridad de compatibilidad, este comportamiento no está garantizado en todos los agentes de usuario, plataformas o contextos (como XML o XHTML, donde estas referencias causan errores de análisis).
- Accesibilidad: Los lectores de pantalla y otras tecnologías de asistencia pueden no interpretar en absoluto los caracteres de control C1, resultando en contenido faltante o corrupto para usuarios que dependen de ellos.
- Integridad de datos: Si tu HTML es procesado por herramientas, APIs o analizadores que siguen la especificación estrictamente, estas referencias inválidas pueden causar fallos o pérdida de datos.
Cómo solucionarlo
-
Usa referencias de carácter con nombre donde estén disponibles — son la opción más legible (ej.,
—,’,€). -
Usa puntos de código Unicode correctos en referencias numéricas si una referencia con nombre no está disponible (ej.,
—o—para una raya larga). -
Usa el carácter UTF-8 literal directamente en tu archivo fuente. Si tu documento está guardado como UTF-8 (como debería ser), puedes simplemente escribir
—,', o€directamente. - Audita contenido heredado que puede haber sido migrado desde sistemas o bases de datos más antiguas usando codificación Windows-1252. Una búsqueda de referencias numéricas en el rango decimal 128–159 encontrará todas las instancias.
Ejemplos
Inválido: referencias del rango de controles C1
Estas referencias se resuelven a puntos de código de control C1, no a los caracteres deseados:
<p>Price: €50</p>
<p>She said, “Hello.”</p>
<p>2020–2024</p>
<p>Wait — what?</p>
<p>It’s a beautiful day.</p>
Corregido: referencias Unicode correctas
Reemplaza cada referencia inválida con el punto de código Unicode apropiado o referencia con nombre:
<p>Price: €50</p>
<p>She said, “Hello.”</p>
<p>2020–2024</p>
<p>Wait — what?</p>
<p>It’s a beautiful day.</p>
Corregido: usando puntos de código Unicode numéricos
Si prefieres referencias numéricas, usa los valores Unicode correctos:
<p>Price: €50</p>
<p>She said, “Hello.”</p>
<p>2020–2024</p>
<p>Wait — what?</p>
<p>It’s a beautiful day.</p>
Corregido: usando caracteres UTF-8 literales
El enfoque más simple — simplemente usa los caracteres directamente en un documento codificado en UTF-8:
<p>Price: €50</p>
<p>She said, "Hello."</p>
<p>2020–2024</p>
<p>Wait — what?</p>
<p>It's a beautiful day.</p>
Encuentra problemas como este automáticamente
Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.