Si bien el lenguaje de marcado de hipertexto ( HTML ) se utiliza desde 1991, HTML 4.0, de diciembre de 1997, fue la primera versión estandarizada que ofreció un tratamiento razonablemente completo a los caracteres internacionales . Cuando un documento HTML incluye caracteres especiales que no pertenecen al rango de siete bits de ASCII , conviene tener en cuenta dos aspectos: la integridad de la información y su visualización en todos los navegadores .
En la versión 5.3 de la especificación W3C, ahora retirada, y en el Living Standard actual publicado por WHATWG, la única codificación válida es UTF-8 . [ 1 ] [ 2 ]
Especificar la codificación de caracteres del documento.
Existen dos formas generales de especificar qué codificación de caracteres se utiliza en el documento.
Primero, el servidor web puede incluir la codificación de caracteres o " charset" en el encabezado del Protocolo de transferencia de hipertexto (HTTP) Content-Type, que normalmente se vería así: [ 3 ]
Tipo de contenido: texto/html; charset=utf-8Este método le brinda al servidor HTTP una forma conveniente de modificar la codificación del documento según la negociación de contenido ; ciertos programas de servidor HTTP pueden hacerlo, por ejemplo Apache con el módulomod_charset_lite . [ 4 ]
En segundo lugar, se puede incluir una declaración dentro del propio documento.
Para HTML es posible incluir esta información dentro del headelemento cerca de la parte superior del documento: [ 2 ]
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >HTML5 también permite que la siguiente sintaxis signifique exactamente lo mismo: [ 2 ]
< meta charset = "utf-8" >Los documentos XHTML tienen una tercera opción: expresar la codificación de caracteres mediante una declaración XML , como sigue: [ 5 ]
<?xml version="1.0" encoding="utf-8"?>Con este segundo enfoque, dado que la codificación de caracteres no se puede conocer hasta que se analiza la declaración, surge el problema de saber qué codificación de caracteres se utiliza en el documento hasta la declaración misma inclusive. Si la codificación de caracteres es una extensión de ASCII , entonces el contenido hasta la declaración misma inclusive debería ser ASCII puro y esto funcionará correctamente. Para codificaciones de caracteres que no son extensiones de ASCII (es decir, que no son un superconjunto de ASCII), como UTF-16BE y UTF-16LE , un procesador de HTML, como un navegador web, debería poder analizar la declaración en algunos casos mediante el uso de heurísticas.
Aunque el HTML escrito según el estándar Living Standard actual debe estar en UTF-8, se requiere una declaración de codificación, en cualquiera de las formas anteriores. Debe coincidir sin distinción de mayúsculas y minúsculas con la cadena "utf-8" y el documento debe estar, de hecho, en UTF-8. [ 2 ] [ 1 ]
Algoritmo de detección de codificación
En la especificación se define un "algoritmo de detección de codificación" para determinar la codificación de caracteres del documento basándose en múltiples fuentes de entrada, entre las que se incluyen:
- Instrucciones explícitas para el usuario
- Una etiqueta meta explícita dentro de los primeros 1024 bytes del documento.
- Una marca de orden de bytes (BOM) dentro de los tres primeros bytes del documento.
- El Content-Type HTTP u otra información de la capa de transporte
- Análisis de los bytes del documento en busca de secuencias específicas o rangos de valores de bytes, [ 6 ] y otros mecanismos de detección tentativos.
Los caracteres que no pertenecen al rango ASCII imprimible (32 a 126) pueden aparecer incorrectamente si el documento se sirve con una codificación de caracteres errónea. Esto no suele ser un problema para los usuarios angloparlantes , pero otros idiomas requieren habitualmente —en algunos casos, siempre— caracteres fuera de ese rango. En entornos lingüísticos como chino, japonés y coreano ( CJK ), donde se utilizan varias codificaciones multibyte diferentes, también se suele emplear la detección automática. Por último, los navegadores suelen permitir al usuario corregir manualmente la etiqueta de conjunto de caracteres incorrecta .
UTF-8 ha sido la codificación de caracteres más común en la web desde 2008, en parte porque, como codificación de Unicode , permite el uso de la misma codificación para todos los idiomas. A partir de enero de 2026 UTF-8 es utilizado por el 98,9% de los sitios web encuestados por W3Techs. [ 7 ] UTF-16 o UTF-32 , otras codificaciones de Unicode, son menos utilizadas porque pueden ser más difíciles de manejar en lenguajes de programación que asumen una codificación de superconjunto ASCII orientada a bytes , y son menos eficientes para texto con una alta frecuencia de caracteres ASCII, que suele ser el caso de los documentos HTML.
La visualización correcta de una página no implica necesariamente que su codificación esté especificada correctamente. Si tanto el creador como el lector de la página asumen una codificación de caracteres específica de la plataforma, y el servidor no envía ninguna información de identificación, el lector verá la página tal como la concibió el creador, pero otros lectores en plataformas diferentes o con idiomas nativos distintos no la verán como se pretendía.
Codificaciones permitidas
Versión 5.3 del estándar W3C retirado y el actual ( a partir de 2026)) El estándar de vida WHATWG requiere UTF-8. No se considera válida ninguna otra codificación. [ 1 ] [ 2 ] No obstante, las implementaciones deben utilizar el algoritmo de detección de codificación para determinar qué codificación aplicar al documento, de acuerdo con el principio de robustez .
El estándar de codificación WHATWG , referenciado por ambos estándares, especifica una lista de codificaciones que los navegadores deben admitir. Los estándares HTML prohíben la compatibilidad con otras codificaciones. [ 8 ] [ 9 ] [ 10 ] El estándar de codificación estipula además que los nuevos formatos, los nuevos protocolos (incluso cuando se utilizan formatos existentes) y los autores de nuevos documentos deben usar exclusivamente UTF-8 . [ 11 ]
Además de UTF-8, las siguientes codificaciones se enumeran explícitamente en el propio estándar HTML, con referencia al Estándar de codificación: [ 10 ]
- ISO-8859-2
- ISO-8859-7 [ a ]
- ISO-8859-8
- Windows-874 [ b ] [ a ]
- Windows-1250
- Windows-1251
- Windows-1252 [ c ]
- Windows-1254 [ d ]
- Windows-1255 [ a ]
- Windows-1256
- Windows-1257
- Windows-1258 [ a ]
- GB 18030 [ e ]
- Big5 [ f ]
- Shift_JIS [ g ]
- ISO-2022-JP [ h ]
- EUC-KR [ i ]
- UTF-16BE [ j ]
- UTF-16LE [ k ]
- x-definido por el usuario [ l ]
- 1 2 3 4 Omitido de la versión 5.3 del W3C.
- ↑ También especificado para
TIS-620,ISO-8859-11y etiquetas relacionadas. [ 11 ] - ↑ También especificado para
ASCII,ISO-8859-1y etiquetas relacionadas. [ 11 ] - ↑ También especificado para
ISO-8859-9y etiquetas relacionadas. [ 11 ] - ↑ Especificado con 0xA3A0 como una codificación duplicada del espacio ideográfico (U+3000) por razones de compatibilidad, y como tal excluye U+E5E5 (un carácter de uso privado). [ 12 ] [ 13 ] También, especificado con 0x80 aceptado como una codificación alternativa del símbolo del euro (U+20AC; ver Windows-936 ). [ 14 ] De lo contrario, sigue las asignaciones del estándar de 2005. [ 13 ]
- ↑ Variante del conjunto de caracteres suplementario de Hong Kong , [ 15 ] aunque la mayoría de las extensiones HKSCS (aquellas con bytes iniciales menores que 0xA1) no son incluidas por el codificador, solo por el decodificador. [ 16 ]
- ↑ La especificación incluye extensiones de IBM y NEC , [ 17 ] y es más precisamente Windows-31J . [ 15 ]
- ↑ La especificación utiliza el mismo índice que se usa para Shift JIS (en la medida en que sea posible), es decir, incluye extensiones NEC.El codificador convierte los caracteres kana de ancho medio a ancho completo, [ 18 ] pero el decodificador los acepta usando una secuencia de escape (ESC 0x28 0x49). [ 19 ] Shift Out y Shift In (0x0E y 0x0F) se excluyen por completo para prevenir ataques. [ 19 ] [ 20 ]
- ↑ En realidad , el Código Hangul Unificado (Windows-949) es un superconjunto que abarca todo el bloque de sílabas Hangul . [ 15 ] [ 21 ]
- ↑ Especificado solo para decodificación; los envíos de formularios desde documentos codificados en UTF-16 deben codificarse en UTF-8 . [ 22 ]
- ↑ Para compatibilidad con el contenido implementado, también especificado para la
UTF-16etiqueta simple, [ 23 ] aunque una marca de orden de bytes (BOM), si está presente, tiene prioridad sobre cualquier etiqueta. [ 24 ] Especificado solo para decodificación; los envíos de formularios de documentos codificados en UTF-16 deben codificarse en UTF-8 . [ 22 ] - ↑ Asigna los rangos 0x00 a 0x7F a U+0000 a U+007F, y los rangos 0x80 a 0xFF a U+F780 a U+F7FF (un rango de Área de Uso Privado ), de modo que los 8 bits inferiores del punto de código siempre coinciden con el byte original. [ 25 ]
Las siguientes codificaciones adicionales se enumeran en el Estándar de Codificación, y por lo tanto también se requiere soporte para ellas: [ 11 ]
- ↑ Utiliza el mismo codificador y decodificador que ISO-8859-8, pero no está sujeto al comportamiento de orden visual que se utiliza para los documentos etiquetados como ISO-8859-8. [ 26 ]
- ↑ Titulado KOI8-U y especificado para ambas
KOI8-UetiquetasKOI8-RU; [ 11 ] sigue a KOI8-RU en las posiciones 0xAE y 0xBE (es decir, incluye Ў/ў ) [ 27 ] [ 28 ] pero KOI8-U en las posiciones 0x93–9F. [ 27 ] - ↑ También especificado para
GB2312y etiquetas relacionadas. Se maneja igual que GB 18030 para fines de decodificación. [ 29 ] Para fines de codificación, el etiquetado como GBK (o GB 2312 ) excluye los códigos de cuatro bytes y favorece la representación de un byte 0x80 para U+20AC. [ 12 ] - ↑ La especificación utiliza el mismo índice que se usa para Shift JIS (en la medida en que esté dentro del alcance del conjunto de códigos EUC 1), es decir, incluye extensiones NEC. JIS X 0212 se incluye solo para decodificación. [ 30 ]
Las siguientes codificaciones se enumeran como ejemplos explícitos de codificaciones prohibidas: [ 10 ]
El estándar también define un decodificador de "reemplazo", que asigna todo el contenido etiquetado como ciertas codificaciones al carácter de reemplazo (�), negándose a procesarlo por completo. Esto tiene como objetivo prevenir ataques (por ejemplo, secuencias de comandos entre sitios ) que podrían explotar una diferencia entre el cliente y el servidor en cuanto a las codificaciones admitidas para enmascarar contenido malicioso. [ 31 ] Aunque la misma preocupación de seguridad se aplica a ISO-2022-JP y UTF-16 , que también permiten que las secuencias de bytes ASCII se interpreten de manera diferente, este enfoque no se consideró factible para ellos, ya que se utilizan con mayor frecuencia en el contenido implementado. [ 32 ] Las siguientes codificaciones reciben este tratamiento: [ 33 ]
Referencias de personajes
Además de las codificaciones de caracteres nativas, los caracteres también pueden codificarse como referencias de caracteres , que pueden ser referencias numéricas ( decimal o hexadecimal ) o referencias de entidades de caracteres . A las referencias de entidades de caracteres también se las conoce a veces como entidades con nombre o entidades HTML . El uso de referencias de caracteres en HTML deriva de SGML .
Referencias de caracteres HTML
Una referencia numérica a un carácter en HTML se refiere a un carácter por su punto de código del Conjunto Universal de Caracteres / Unicode y utiliza el formato
&#nnnn;o
&#xhhhh;donde nnnn es el punto de código en formato decimal y hhhh es el punto de código en formato hexadecimal . La x debe estar en minúscula en los documentos XML. nnnn o hhhh pueden contener cualquier número de dígitos y pueden incluir ceros iniciales. hhhh puede combinar mayúsculas y minúsculas, aunque lo habitual es usar mayúsculas.
No todos los navegadores web o clientes de correo electrónico utilizados por quienes reciben documentos HTML, ni los editores de texto utilizados por quienes los crean, podrán mostrar todos los caracteres HTML. La mayoría del software moderno puede mostrar la mayoría o la totalidad de los caracteres del idioma del usuario, y mostrará un recuadro u otro indicador claro para los caracteres que no puede mostrar.
Para los códigos del 0 al 127, el conjunto estándar ASCII original de 7 bits , la mayoría de estos caracteres se pueden usar sin referencia de carácter. Los códigos del 160 al 255 se pueden crear usando nombres de entidades de caracteres . Solo algunos códigos de mayor numeración se pueden crear usando nombres de entidades, pero todos se pueden crear mediante referencias de caracteres con números decimales.
Las referencias a entidades de caracteres también pueden tener el formato donde el nombre es una cadena alfanumérica sensible a mayúsculas y minúsculas. Por ejemplo, "λ" también puede codificarse como en un documento HTML. Las referencias a entidades de caracteres , , y están predefinidas en HTML y SGML, porque , , y ya se utilizan para delimitar el marcado. Cabe destacar que esto no incluía la entidad (') de XML antes de HTML5 . Para obtener una lista de todas las referencias a entidades de caracteres HTML con nombre junto con las versiones en las que se introdujeron, consulte Lista de referencias a entidades de caracteres XML y HTML .&name;λ<>"&<>"&'
El uso innecesario de referencias de caracteres HTML puede reducir significativamente la legibilidad del HTML. Si la codificación de caracteres de una página web se elige adecuadamente, las referencias de caracteres HTML generalmente solo son necesarias para los caracteres delimitadores de marcado, como se mencionó anteriormente, y para algunos caracteres especiales (o ninguna si se utiliza una codificación Unicode nativa como UTF-8 ). El escape incorrecto de entidades HTML también puede abrir vulnerabilidades de seguridad para ataques de inyección, como el cross-site scripting . Si los atributos HTML no se incluyen entre comillas, ciertos caracteres, sobre todo los espacios en blanco , como el espacio y la tabulación, deben escaparse mediante entidades. Otros lenguajes relacionados con HTML tienen sus propios métodos de escape de caracteres.
Referencias de caracteres XML
A diferencia del HTML tradicional con su amplio rango de referencias a entidades de caracteres, en XML solo hay cinco referencias a entidades de caracteres predefinidas. Estas se utilizan para escapar caracteres que son sensibles al marcado en ciertos contextos: [ 34 ]
Todas las demás referencias a entidades de caracteres deben definirse antes de poder usarse. Por ejemplo, el uso de é(que da é, la letra latina minúscula E con acento agudo, U+00E9 en Unicode) en un documento XML generará un error a menos que la entidad ya haya sido definida. XML también requiere que las xreferencias numéricas hexadecimales estén en minúsculas: por ejemplo, ꆾn lugar de ਛ. XHTML , que es una aplicación XML, admite el conjunto de entidades HTML, junto con las entidades predefinidas de XML.
Véase también
- Charset sniffing : utilizado por muchos navegadores cuando no hay metadatos de codificación de caracteres disponibles.
- Unicode y HTML
- Código de idioma
- Lista de referencias a entidades de caracteres XML y HTML
Referencias
- 1 2 3 "Especificar la codificación de caracteres del documento" . HTML 5.3 . Consorcio World Wide Web . 28 de enero de 2021. Consultado el 6 de enero de 2026 .
- 1 2 3 4 5 "Especificar la codificación de caracteres del documento" . Estándar HTML . WHATWG . 17 de diciembre de 2025. Consultado el 6 de enero de 2026 .
- ↑ Fielding, R.; Reschke, J. (junio de 2014). "Content-Type" . En Fielding, R.; Reschke, J. (eds.). Protocolo de transferencia de hipertexto (HTTP/1.1): semántica y contenido . IETF . doi : 10.17487/RFC7231 . S2CID 14399078. Consultado el 30 de julio de 2014 .
- ↑ "Módulo Apache mod_charset_lite" .
- ↑ Bray, T .; Paoli, J.; Sperberg-McQueen, C .; Maler, E.; Yergeau, F. (26 de noviembre de 2008), "Prolog y declaración de tipo de documento" , XML , W3C , consultado el 8 de marzo de 2010.
- ↑ "HTML5 realiza un preescaneo de una secuencia de bytes para determinar su codificación" .
- ↑ "Encuesta de uso de codificaciones de caracteres desglosada por clasificación" . W3Techs . Enero de 2026. Consultado el 3 de enero de 2026 .
- ↑ "8.2.2.3. Codificaciones de caracteres" . Estándar HTML 5.1 . W3C.
- ↑ "8.2.2.3. Codificaciones de caracteres" . Estándar HTML 5. W3C.
- 1 2 3 "12.2.3.3 Codificaciones de caracteres" . HTML Living Standard . WHATWG.
- ^ van Kesteren , Anne . «4.2: Nombres y etiquetas» . Estándar de codificación . QUÉ WG .
- 1 2 van Kesteren, Anne . "10.2.2. Codificador gb18030" . Estándar de codificación . QUÉ WG .
- 1 2 van Kesteren, Anne . "5. Índices (§ índice gb18030)" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . "10.2.1. Decodificador gb18030" . Estándar de codificación . QUÉ WG .
- 1 2 3 Fundación Mozilla . "Diferencias notables con la nomenclatura de IANA" . Crate encoding_rs . docs.rs.
- ↑ van Kesteren, Ana . "5. Índices (§ índice puntero Big5)" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . "5. Índices (§ Índice jis0208)" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . «5. Índices (§ Índice ISO-2022-JP katakana)» . Estándar de codificación . QUÉ WG .
- 1 2 van Kesteren, Anne . «12.2.1. Decodificador ISO-2022-JP» . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . «12.2.2. Codificador ISO-2022-JP» . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . «5. Índices (§ índice EUC-KR)» . Estándar de codificación . QUÉ WG .
- 1 2 van Kesteren, Anne . "4.3. Codificaciones de salida" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . "14.4.UTF-16LE" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . «6. Ganchos para estándares (§ decodificar)» . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . "14.5. x definido por el usuario" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . "9. Codificaciones heredadas de un solo byte (§ Nota)" . Estándar de codificación . QUÉ WG .
- 1 2 van Kesteren, Anne . "visualización del índice KOI8-U" . Estándar de codificación . QUÉ WG .
- ↑ "Error 17053: Compatibilidad con la asignación de KOI8-RU para KOI8-U" . W3C Bugzilla . 19 de agosto de 2015.
- ↑ van Kesteren, Ana . "10.1. GBK" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . "5. Índices (§ Índice jis0212)" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . "14.1: sustitución" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . "2: Antecedentes de seguridad" . Estándar de codificación . QUÉ WG .
- ↑ van Kesteren, Ana . «4.2: Nombres y etiquetas (§ sustitución)» . Estándar de codificación . QUÉ WG .
- ↑ Bray, T. ; Paoli, J.; Sperberg-McQueen, C. ; Maler, E.; Yergeau, F. (26 de noviembre de 2008). "Referencias de caracteres y entidades" . XML . W3C . Recuperado el 8 de marzo de 2010 .
Enlaces externos
- Referencias a entidades de caracteres en HTML4
- La guía definitiva para la codificación de caracteres web. Archivada el 29 de julio de 2009 en la Wayback Machine.
- Capítulo sobre codificación de entidades HTML del Manual de seguridad del navegador: más información sobre los navegadores actuales y su manejo de entidades.
- Artículo wiki del Open Web Application Security Project sobre secuencias de comandos entre sitios (XSS).
- HTML
- Estándares del Consorcio World Wide Web