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 los caracteres internacionales recibieron un tratamiento razonablemente completo. 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 del navegador .
Hay 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í: [1]
Tipo de contenido: texto/html; juego de caracteres = utf-8
Este método proporciona al servidor HTTP una manera conveniente de alterar la codificación del documento según 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; charset=utf-8" >
HTML5 también permite que la siguiente sintaxis signifique exactamente lo mismo: [3]
< meta juego de caracteres = "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 para 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 incluida debe ser ASCII puro y esto funcionará correctamente. Para 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, debería poder analizar la declaración en algunos casos a través del uso de heurísticas.
A partir de HTML5, el juego de caracteres recomendado es UTF-8 . [3] En la especificación se define un "algoritmo de rastreo de codificación" para determinar la codificación de caracteres del documento en función de múltiples fuentes de entrada, que incluyen:
Los caracteres fuera del rango ASCII imprimible (32 a 126) suelen aparecer incorrectamente. Esto presenta pocos problemas para los usuarios de habla inglesa , pero otros idiomas requieren regularmente (en algunos casos, siempre) caracteres fuera de ese rango. En entornos de idiomas chino, japonés y coreano ( CJK ), donde se utilizan varias codificaciones multibyte diferentes, también se suele emplear la detección automática. Finalmente, los navegadores generalmente también permiten al usuario anular manualmente la etiqueta del juego de caracteres incorrecto .
Es cada vez 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 usar para todos los lenguajes, se usan 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 alguna codificación de caracteres específica de la plataforma y el servidor no envía ninguna información de identificación, entonces el lector verá la página como pretendía el creador, pero otros lectores en diferentes plataformas o con diferentes idiomas nativos. no verá 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 antiguos competidores W3C HTML 5.0 y 5.1) especifica una lista de codificaciones que los navegadores deben admitir. Los estándares HTML prohíben el soporte de 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 UTF-8 exclusivamente. [9]
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: [8]
TIS-620
y ISO-8859-11
etiquetas relacionadas. [9]ASCII
y ISO-8859-1
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 sólo para decodificación; Los envíos de formularios de documentos codificados en UTF-16 deben codificarse en UTF-8 . [20]Las siguientes codificaciones adicionales se enumeran en el estándar de codificación y, por lo tanto, también se requiere compatibilidad con 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 igual 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 las codificaciones admitidas 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 usan comparativamente con más frecuencia en sistemas desplegados. contenido. [30] Las siguientes codificaciones reciben este tratamiento: [31]
Además de las codificaciones de caracteres nativos, los caracteres también se pueden codificar como referencias de caracteres , que pueden ser referencias de caracteres numéricos ( decimal o hexadecimal ) o referencias de entidades de caracteres . Las referencias a entidades de caracteres también se denominan a veces entidades nombradas o entidades HTML para HTML. El uso de referencias de caracteres en HTML 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 forma decimal y hhhh es el punto de código en forma hexadecimal . La x debe estar en minúscula en documentos XML. nnnn o hhhh pueden tener cualquier número de dígitos y pueden incluir ceros a la izquierda . El hhhh puede mezclar mayúsculas y minúsculas, aunque el estilo habitual es el de mayúsculas.
No todos los navegadores web o clientes de correo electrónico utilizados por los receptores de documentos HTML, ni todos los editores de texto utilizados por los autores de documentos HTML, podrán representar todos los caracteres HTML. La mayoría del software moderno es capaz de 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 pueden representar.
Para los códigos del 0 al 127, el conjunto estándar ASCII de 7 bits original , la mayoría de estos caracteres se pueden utilizar sin una referencia de carácter. Todos los códigos del 160 al 255 se pueden crear utilizando nombres de entidades de caracteres . Sólo se pueden crear unos pocos códigos con números más altos utilizando nombres de entidades, pero todos se pueden crear mediante referencia de caracteres de números decimales.
Las referencias de entidades de caracteres también pueden tener el formato en el que 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. La entidad de carácter hace referencia a , y está predefinida en HTML y SGML, porque , y ya se utilizan para delimitar el marcado. En particular, esto no incluía la entidad XML (') anterior a HTML5 . Para obtener una lista de todas las referencias de entidades de caracteres HTML con nombre junto con las versiones en las que se introdujeron, consulte Lista de referencias de entidades de caracteres HTML y XML .&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, entonces 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 una entidad HTML también puede abrir vulnerabilidades de seguridad para ataques de inyección, como secuencias de comandos entre sitios . Si los atributos HTML se dejan sin comillas, ciertos caracteres, sobre todo los espacios en blanco , como el espacio y el tabulador, deben tener caracteres de escape mediante entidades. Otros lenguajes relacionados con HTML tienen sus propios métodos para escapar de caracteres.
A diferencia del HTML tradicional con su amplia gama de referencias de entidades de caracteres, en XML sólo hay cinco referencias de entidades de caracteres predefinidas. Se utilizan para escapar de 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 é, 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.