Codificación de caracteres en HTML
Si bien el Lenguaje de marcado de hipertexto (HTML) ha estado en uso 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.
Especificar la codificación de caracteres del documento
Hay dos formas generales de especificar qué codificación de caracteres se usa en el documento.
Primero, el servidor web puede incluir la codificación de caracteres o "charset
" en el encabezado Content-Type
del Protocolo de transferencia de hipertexto (HTTP), que normalmente se vería así:
Tipo de contenido: texto/html; charset=utf-8
Este método le da al servidor HTTP una manera conveniente de alterar la codificación del documento de acuerdo con la negociación de contenido; cierto software de servidor HTTP puede hacerlo, por ejemplo, Apache con el módulo mod_charset_lite
.
En segundo lugar, se puede incluir una declaración dentro del propio documento.
Para HTML, es posible incluir esta información dentro del elemento head
cerca de la parte superior del documento:
.meta http-equiv="Content-Type" contenido="text/html; charset=utf-8"■
HTML5 también permite que la siguiente sintaxis signifique exactamente lo mismo:
.meta charset="utf-8"■
Los documentos XHTML tienen una tercera opción: expresar la codificación de caracteres a través de una declaración XML, de la siguiente manera:
¿Según la versión xml="1.0" encoding="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 usa en el documento hasta la declaración misma incluida. Si la codificación de caracteres es una extensión ASCII, entonces el contenido hasta la declaración en sí misma debe ser ASCII puro y 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, debería poder analizar la declaración en algunos casos a través de la uso de heurísticas.
Algoritmo de detección de codificación
A partir de HTML5, el juego de caracteres recomendado es UTF-8. Un "algoritmo de rastreo de codificación" se define en la especificación para determinar la codificación de caracteres del documento en función de múltiples fuentes de entrada, que incluyen:
- Instrucción del usuario explícito
- Una meta tag explícita dentro de los primeros 1024 bytes del documento
- Un byte order mark (BOM) dentro de los tres primeros bytes del documento
- La información HTTP Content-Type u otra capa de transporte
- Análisis de los bytes de documentos que buscan secuencias específicas o rangos de valores byte, y otros mecanismos de detección tentativos.
Los caracteres fuera del rango ASCII imprimible (32 a 126) generalmente aparecen incorrectamente. Esto presenta pocos problemas para los usuarios de habla inglesa, pero otros idiomas regularmente (en algunos casos, siempre) requieren caracteres fuera de ese rango. En entornos de idioma chino, japonés y coreano (CJK) en los que se utilizan varias codificaciones de varios bytes diferentes, también se suele emplear la detección automática. Finalmente, los navegadores generalmente también permiten al usuario anular la etiqueta del conjunto de caracteres incorrecta manualmente.
Cada vez es más común que los sitios web multilingües y los sitios web en idiomas no occidentales utilicen UTF-8, lo 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 idiomas, 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 se haya especificado correctamente. Si el creador y 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, el lector verá la página de todos modos como el creador pretendía, pero otros lectores en diferentes plataformas o con diferentes idiomas nativos no verán la página según lo previsto.
Codificaciones permitidas
El estándar de codificación WHATWG, al que se hace referencia en los estándares HTML recientes (el estándar vivo HTML WHATWG actual, así como el HTML 5.0 y 5.1 del W3C de la competencia anterior) especifica una lista de codificaciones que los navegadores deben admitir. Los estándares HTML prohíben el soporte de otras codificaciones. El Estándar de codificación estipula además que los nuevos formatos, los nuevos protocolos (incluso cuando se usan los formatos existentes) y los autores de nuevos documentos deben usar UTF-8 exclusivamente.
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:
- ISO-8859-2
- ISO-8859-7
- ISO-8859-8
- Windows-874
- Windows-1250
- Windows-1251
- Windows-1252
- Windows-1254
- Windows-1255
- Windows-1256
- Windows-1257
- Windows-1258
- GB 18030
- Big5
- Shift JIS
- ISO-2022-JP
- EUC-KR
- UTF-16BE
- UTF-16LE
- x-usuario definido
- ^ También se especifica para
TIS-620
,ISO-8859-11
y etiquetas relacionadas. - ^ También se especifica para
ASCII
,ISO-8859-1
y etiquetas relacionadas. - ^ También se especifica para
ISO-8859-9
y etiquetas relacionadas. - ^ Especificado con 0xA3A0 como codificación duplicada del espacio ideográfico (U+3000) por razones de compatibilidad, y como tal, excluyendo U+E5E5 (un personaje de uso privado). También, especificado con 0x80 aceptado como una codificación alternativa del signo del euro (U+20AC; ver Windows-936). De lo contrario, sigue las asignaciones de la norma 2005.
- ^ Hong Kong Supplementary Character Establecer variante, aunque la mayoría de las extensiones HKSCS (las con bytes de plomo menos de 0xA1) no están incluidas por el encoder, sólo por el decodificador.
- ^ La especificación incluye extensiones IBM y NEC (ver Windows-31J).
- ^ La especificación utiliza el mismo índice que se utiliza para Shift JIS (en la medida en que está al alcance), es decir, incluye extensiones NEC. El kana de medio ancho es convertido a ancho completo por el encoder, pero aceptado mediante una secuencia de escape (ESC 0x28 0x49) por el decodificador. Shift Out y Shift In (0x0E y 0x0F) se excluyen completamente para prevenir ataques.
- ^ En realidad Unified Hangul Code, que es un superset que cubre todo el bloque Hangul Syllables.
- ^ Especificado para decodificación solamente; las presentaciones de formulario de documentos codificados por UTF-16 se codificarán en UTF-8.
- ^ Para compatibilidad con el contenido desplegado, también especificado para la llanura
UTF-16
etiqueta, aunque una marca de orden byte (BOM), si está presente, tiene prioridad sobre cualquier etiqueta. Especificado para decodificación solamente; las presentaciones de formulario de documentos codificados por UTF-16 se codificarán en UTF-8. - ^ Mapas 0x00 a 0x7F a U+0000 a través de U+007F, y 0x80 a 0xFF a U+F780 a través de U+F7FF (una gama de Área de Uso Privado), tal que los 8 bits bajos del punto de código siempre coinciden con el byte original.
Las siguientes codificaciones adicionales se enumeran en el Estándar de codificación y, por lo tanto, también se requiere soporte para ellas:
- Párrafo 866
- ISO-8859-3
- ISO-8859-4
- ISO-8859-5
- ISO-8859-6
- ISO-8859-8-I
- ISO-8859-10
- ISO-8859-13
- ISO-8859-14
- ISO-8859-15
- ISO-8859-16
- KOI8-R
- KOI8-U / KOI8-RU
- Mac OS Roman
- Windows-1253
- Mac OS Cyrillic
- GBK
- EUC-JP
- ^ Utiliza el mismo encoder y decodificador que ISO-8859-8, pero no está sujeto al comportamiento de orden visual que se utiliza para documentos etiquetados como ISO-8859-8.
- ^ Título KOI8-U y especificado para ambos
KOI8-U
yKOI8-RU
etiquetas, pero sigue la KOI8-RU (es decir, incluye la χ/ - ^ También se especifica para
GB 2312
y etiquetas relacionadas. Manejó lo mismo que GB 18030 para fines de decodificación. Para fines de codificación, etiquetado como GBK (o GB 2312) excluye códigos de cuatro bytes, y favorece la representación de un byte 0x80 para U+20AC. - ^ La especificación utiliza el mismo índice que se utiliza para Shift JIS (en la medida en que está al alcance del conjunto de códigos EUC 1), es decir, incluye extensiones NEC. JIS X 0212 se incluye sólo para la decodificación.
Las siguientes codificaciones se enumeran como ejemplos explícitos de codificaciones prohibidas:
- CESU-8
- UTF-7
- BOCU-1
- SCSU
- EBCDIC
- UTF-32
El estándar también define un "reemplazo" decodificador, 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. 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 el contenido implementado. Las siguientes codificaciones reciben este tratamiento:
- ISO-2022-KR
- ISO-2022-CN
- ISO-2022-CN-EXT
- HZ-GB-2312
Referencias de personajes
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 (decimales o hexadecimales) o entidades de caracteres referencias. Las referencias a entidades de caracteres también se denominan a veces entidades con nombre o entidades HTML para HTML. El uso de HTML de referencias de caracteres se deriva de SGML.
Referencias de caracteres HTML
Una referencia de carácter numérico en HTML se refiere a un carácter por su punto de código de conjunto de caracteres universal/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úsculas en los documentos XML. El nnnn o hhhh puede tener cualquier número de dígitos y puede incluir ceros a la izquierda. El 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 los editores de texto utilizados por los autores de documentos HTML, podrán representar 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 pueden representar.
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 una referencia de carácter. Todos los códigos del 160 al 255 se pueden crear utilizando nombres de entidades de caracteres. Solo se pueden crear algunos códigos con números más altos 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 &name;
donde name 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 caracteres hace referencia a <
, >
, "
y &
están predefinidos en HTML y SGML, porque <
, >
, "
y &
ya se utilizan para delimitar el marcado. En particular, esto no incluía la entidad '
(') de XML antes de 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.
El uso innecesario de referencias de caracteres HTML puede reducir significativamente la legibilidad de HTML. Si la codificación de caracteres para una página web se elige correctamente, las referencias de caracteres HTML generalmente solo se requieren para los caracteres delimitadores de marcado como se mencionó anteriormente, y para algunos caracteres especiales (o ninguno si se usa una codificación Unicode nativa como UTF-8). El escape incorrecto de la 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 la tabulación, se deben escapar 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 amplia gama de referencias de entidades de caracteres, en XML solo hay cinco referencias de entidades de caracteres predefinidas. Estos se utilizan para escapar de los caracteres que son sensibles al marcado en ciertos contextos:
&
→ & (ampersand, U+0026)<
→ (menos signo, U+003C)>
→ √≥ (ver más alto que signo, U+003E)"
→ " (marca de citación, U+0022)'
→ ' (Apóstrofe, U+0027)
Todas las demás referencias a entidades de caracteres deben definirse antes de que puedan 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 definido. XML también requiere que x
en las referencias numéricas hexadecimales esté 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.
Contenido relacionado
Laboratorio Nacional de Aceleradores SLAC
Intel DX4
Blue Streak (misil)