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 en la que se dio un tratamiento razonablemente completo a los caracteres internacionales. Cuando un documento HTML incluye caracteres especiales fuera del rango de ASCII de siete bits , vale la pena considerar dos objetivos: la integridad de la información y la visualización universal en el navegador .
Hay dos formas generales de especificar qué codificación de caracteres se utiliza en el documento.
En primer lugar, 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í: [1]
Tipo de contenido: texto/html; conjunto de caracteres=utf-8
Este método proporciona al servidor HTTP una forma conveniente de alterar la codificación del documento de acuerdo con la negociación del contenido ; cierto software de servidor HTTP puede hacerlo, por ejemplo Apache con el módulo mod_charset_lite
. [2]
En segundo lugar, se puede incluir una declaración dentro del propio documento.
Para HTML es posible incluir esta información dentro del head
elemento cerca de la parte superior del documento: [3]
< meta http-equiv = "Tipo de contenido" contenido = "texto/html; conjunto de caracteres=utf-8" >
HTML5 también permite que la siguiente sintaxis signifique exactamente lo mismo: [3]
< meta charset = "utf-8" >
Los documentos XHTML tienen una tercera opción: expresar la codificación de caracteres mediante una declaración XML , de la siguiente manera: [4]
<?xml versión="1.0" codificación="utf-8"?>
Con este segundo enfoque, debido a que la codificación de caracteres no se puede conocer hasta que se analiza la declaración, existe un problema al 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 ASCII , entonces el contenido hasta la declaración misma inclusive debe ser ASCII puro y esto funcionará correctamente. Para las codificaciones de caracteres que no son extensiones ASCII (es decir, no un superconjunto de ASCII), como UTF-16BE y UTF-16LE , un procesador de HTML, como un navegador web, debe poder analizar la declaración en algunos casos mediante el uso de heurística.
A partir de HTML5, el conjunto de caracteres recomendado es UTF-8 . [3] En la especificación se define un "algoritmo de detección de codificación" para determinar la codificación de caracteres del documento en función de múltiples fuentes de entrada, entre las que se incluyen:
Los caracteres que se encuentran fuera del rango ASCII imprimible (32 a 126) suelen aparecer de forma incorrecta. Esto presenta pocos problemas para los usuarios de habla inglesa , pero otros idiomas requieren con regularidad (en algunos casos, siempre) caracteres fuera de ese rango. En los entornos de los idiomas 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 anular manualmente la etiqueta de conjunto de caracteres incorrecta .
Cada vez es más común que los sitios web multilingües y los sitios web en idiomas no occidentales utilicen UTF-8 , que permite el uso de la misma codificación para todos los idiomas. UTF-16 o UTF-32 , que también se pueden utilizar para todos los idiomas, se utilizan menos 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 exitosa de una página no es necesariamente una indicación de 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 de todos modos como el creador pretendía, pero otros lectores en plataformas diferentes o con idiomas nativos diferentes no verán la página como estaba previsto.
El estándar de codificación WHATWG , al que hacen referencia los estándares HTML recientes (el actual WHATWG HTML Living Standard, así como los anteriormente competidores HTML 5.0 y 5.1 del W3C ) especifica una lista de codificaciones que los navegadores deben admitir. Los estándares HTML prohíben la compatibilidad con otras codificaciones. [6] [7] [8] 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 utilizar exclusivamente UTF-8 . [9]
Además de UTF-8, las siguientes codificaciones están explícitamente enumeradas en el propio estándar HTML, con referencia al Estándar de codificación: [8]
TIS-620
, ISO-8859-11
y etiquetas relacionadas. [9]ASCII
, ISO-8859-1
y etiquetas relacionadas. [9]ISO-8859-9
etiquetas relacionadas. [9]UTF-16
etiqueta simple, [21] aunque una marca de orden de bytes (BOM), si está presente, tiene prioridad sobre cualquier etiqueta. [22] Especificado solo para decodificación; los envíos de formularios de documentos codificados en UTF-16 deben codificarse en UTF-8 . [20]Las siguientes codificaciones adicionales están incluidas en el Estándar de codificación y, por lo tanto, también se requiere soporte para ellas: [9]
KOI8-U
etiquetas KOI8-RU
; [9] sigue a KOI8-RU en las posiciones 0xAE y 0xBE (es decir, incluye Ў/ў ) [25] [26] pero KOI8-U en las posiciones 0x93–9F. [25]GB2312
etiquetas relacionadas. Se maneja de la misma manera que GB 18030 para fines de decodificación. [27] Para fines de codificación, el etiquetado como GBK (o GB 2312 ) excluye los códigos de cuatro bytes y favorece la representación 0x80 de un byte para U+20AC. [10]Las siguientes codificaciones se enumeran como ejemplos explícitos de codificaciones prohibidas: [8]
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 en absoluto. Esto tiene como objetivo evitar ataques (por ejemplo, secuencias de comandos entre sitios ) que pueden explotar una diferencia entre el cliente y el servidor en cuanto a qué codificaciones se admiten para enmascarar contenido malicioso. [29] 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 comparativamente con mayor frecuencia en el contenido implementado. [30] Las siguientes codificaciones reciben este tratamiento: [31]
Además de las codificaciones de caracteres nativas, los caracteres también se pueden codificar como referencias de caracteres , que pueden ser referencias de caracteres numéricos ( decimales o hexadecimales ) o referencias de entidades de caracteres . Las referencias de entidades de caracteres también se denominan a veces entidades con nombre o entidades HTML para HTML. El uso de referencias de caracteres en HTML se deriva de SGML .
Una referencia de carácter numérico en HTML se refiere a un carácter por su conjunto de caracteres universales / punto de código 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 ser cualquier número de dígitos y pueden incluir ceros a la izquierda. hhhh puede mezclar mayúsculas y minúsculas, aunque las mayúsculas son el estilo habitual.
No todos los navegadores web o clientes de correo electrónico utilizados por los receptores de documentos HTML, o editores de texto utilizados por los autores de documentos HTML, podrán reproducir todos los caracteres HTML. La mayoría del software moderno puede mostrar la mayoría o todos los caracteres del idioma del usuario y dibujará un cuadro u otro indicador claro para los caracteres que no pueda reproducir.
Para los códigos de 0 a 127, el conjunto estándar ASCII original de 7 bits , la mayoría de estos caracteres se pueden utilizar sin una referencia de carácter. Los códigos de 160 a 255 se pueden crear utilizando nombres de entidad de carácter . Solo se pueden crear unos pocos códigos de números superiores utilizando nombres de entidad, pero todos se pueden crear mediante una referencia de carácter de número decimal.
Las referencias a entidades de caracteres también pueden tener el formato donde el nombre es una cadena alfanumérica que distingue entre mayúsculas y minúsculas. Por ejemplo, "λ" también se puede codificar 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. Esto no incluía la entidad (') de XML anterior a 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 para una página web se elige adecuadamente, las referencias de caracteres HTML generalmente solo se requieren para los caracteres que delimitan el marcado, como se mencionó anteriormente, y para algunos caracteres especiales (o ninguno en absoluto si se usa 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 cross-site scripting . Si los atributos HTML se dejan sin comillas, ciertos caracteres, sobre todo los espacios en blanco , como el espacio y la tabulación, deben escaparse utilizando entidades. Otros lenguajes relacionados con HTML tienen sus propios métodos de escape de caracteres.
A diferencia del HTML tradicional, con su amplia gama 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: [32]
Todas las demás referencias a entidades de caracteres deben definirse antes de poder usarse. Por ejemplo, el uso de é
(que da como resultado é, E minúscula latina 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 x
referencias numéricas hexadecimales estén en minúsculas: por ejemplo ਛ
en lugar de ਛ
. XHTML , que es una aplicación XML, admite el conjunto de entidades HTML, junto con las entidades predefinidas de XML.