5 Representación de Documentos HTML

Nota: Este documento es parte de una traducción al castellano de la Recomendación del W3C "HTML 4.01 Specification" (más información). Puede consultar la versión original del mismo. Para cualquier comentario o corrección acerca de la traducción póngase en contacto con el traductor en jrpozo[arroba]conclase.net. Gracias por su colaboración.

Véase el Aviso de copyright de la traducción.

Contenidos

  1. El Conjunto de Caracteres del Documento
  2. Codificaciones de caracteres
    1. Elección de una codificación
    2. Especificación de la codificación de caracteres
  3. Referencias de caracteres
    1. Referencias numéricas de caracteres
    2. Referencias a entidades de caracteres
  4. Caracteres no representables

En este capítulo hablamos sobre cómo se representan los documentos HTML en una computadora y en Internet.

La sección sobre el conjunto de caracteres del documento trata la cuestión de qué caracteres abstractos pueden formar parte de un documento HTML. Estos caracteres incluyen la letra latina "A", la letra cirílica "I", el carácter chino que significa "agua", etc.

La sección sobre las codificaciones de caracteres trata la cuestión de cómo pueden representarse esos caracteres en un fichero o cuando se transmiten por Internet. Como algunas codificaciones de caracteres no pueden representar directamente todos los caracteres que un autor puede querer incluir en un documento, HTML ofrece otros mecanismos, llamados referencias de caracteres, para hacer referencia a cualquier carácter.

Al haber un gran número de caracteres en todos los lenguajes humanos, y una gran variedad de formas de representar estos caracteres, debe tenerse un cuidado especial para que los documentos puedan ser entendidos por agentes de usuario de todo el mundo.

5.1 El Conjunto de Caracteres del Documento

Para promover la interoperabilidad, SGML requiere que cada aplicación (incluyendo al HTML) especifique su conjunto de caracteres del documento. Un conjunto de caracteres del documento consiste en:

Cada documento SGML (incluidos los documentos HTML) es una secuencia de caracteres del repertorio. Los sistemas informáticos identifican cada carácter según la posición de su código; por ejemplo, en el conjunto de caracteres ASCII, las posiciones de los códigos 65, 66 y 67 se refieren a los caracteres 'A', 'B' y 'C' respectivamente.

El conjunto de caracteres ASCII no es suficiente para un sistema de información global como la Web, de modo que HTML usa un conjunto de caracteres mucho más completo llamado Conjunto Universal de Caracteres (Universal Character Set, UCS), definido en [ISO10646]. Este estándar define un repertorio de miles de caracteres usados por comunidades de todo el mundo.

El conjunto de caracteres definido en [ISO10646] es equivalente carácter por carácter a Unicode ([UNICODE]). Ambos estándares se actualizan de vez en cuando con nuevos caracteres, y las correcciones deberían consultarse en los sitios web respectivos. En la especificación actual, se utiliza "[ISO10646]" para hacer referencia al conjunto de caracteres del documento, mientras que "[UNICODE]" se reserva para hacer referencia al algoritmo de texto bidireccional de Unicode.

El conjunto de caracteres del documento no es suficiente, sin embargo, para permitir a los agentes de usuario interpretar correctamente los documentos HTML del modo en que éstos se intercambian normalmente: codificados como una secuencia de bytes en un fichero o durante una transmisión en red. Los agentes de usuario deben conocer además la codificación de caracteres específica que fue usada para transformar el flujo de caracteres del documento en un flujo de bytes.

5.2 Codificaciones de caracteres

Lo que en esta especificación se denomina codificación de caracteres se conoce con nombres diferentes en otras especificaciones (lo cual puede causar cierta confusión). Sin embargo, el concepto es básicamente el mismo en todo Internet. Asimismo, las cabeceras, atributos y parámetros del protocolo que se refieren a la codificación de caracteres comparten todos el mismo nombre -- "charset" -- y usan los mismos valores del registro [IANA] (ver [CHARSETS] para una lista completa).

El parámetro "charset" identifica una codificación de caracteres, que es un método para convertir una secuencia de bytes en una secuencia de caracteres. Esta conversión se adapta naturalmente al modo de funcionamiento de la Web: los servidores envían los documentos HTML a los agentes de usuario como un flujo de bytes; los agentes de usuario los interpretan como un flujo de caracteres. El método de conversión puede ir desde una correspondencia simple uno a uno hasta complejos algoritmos o procesos de intercambio.

Una técnica simple de codificación uno a uno no es suficiente para cadenas de texto con un repertorio tan amplio como el de [ISO10646]. Hay varias codificaciones diferentes de partes de [ISO10646] además de codificaciones del conjunto completo de caracteres (como por ejemplo UCS-4).

5.2.1 Elección de una codificación

Las herramientas de creación (p.ej., editores de texto) pueden codificar documentos HTML con una codificación de caracteres de su elección, y dicha elección depende en gran medida de las convenciones usadas por el software del sistema. Estas herramientas pueden emplear cualquier codificación que cubra convenientemente la mayor parte de los caracteres contenidos en el documento, suponiendo que la codificación esté etiquetada correctamente. Algunos caracteres se saldrán fuera de esta codificación, pero aún pueden seguir siendo representados mediante referencias de caracteres. Éstas siempre hacen referencia al conjunto de caracteres del documento, no a la codificación de caracteres.

Los servidores y los proxies pueden cambiar la codificación de caracteres (la llamada transcodificación) en tiempo real para atender a las demandas de los agentes de usuario (véase la sección 14.2 sobre [RFC2616], el encabezado de petición HTTP "Accept-Charset"). Los servidores y los proxies no tienen por qué servir un documento con una codificación de caracteres que cubra el conjunto completo de caracteres del documento.

Las codificaciones de caracteres usadas normalmente en la Web incluyen la ISO-8859-1 (también llamada "Latin-1"; utilizable para la mayor parte de los idiomas de Europa occidental), la ISO-8859-5 (que soporta el alfabeto cirílico), la SHIFT_JIS (una codificación japonesa), la EUC-JP (otra codificación japonesa), y la UTF-8 (una codificación de ISO 10646 que utiliza un número diferente de bytes para distintos caracteres). En los nombres de las codificaciones no se distingue entre mayúsculas y minúsculas, así que por ejemplo "SHIFT_JIS", "Shift_JIS", y "shift_jis" son equivalentes.

Esta especificación no dicta qué codificaciones de caracteres debe soportar un agente de usuario.

Los agentes de usuario conformes deben transformar correctamente a ISO 10646 todos los caracteres de todas las codificaciones de caracteres que reconozcan (o deben comportarse como si lo hicieran).

Notas sobre codificaciones específicas 

Cuando un texto HTML se transmite en UTF-16 (charset=UTF-16), los datos de texto deberían transmitirse con el orden de bytes de la red ("big-endian", el byte de mayor peso primero) de acuerdo con [ISO10646], Sección 6.3 y [UNICODE], cláusula C3, página 3-1.

Además, para maximizar la probabilidad de una interpretación correcta, se recomienda que los documentos transmitidos como UTF-16 empiecen siempre con un carácter de ESPACIO NO SEPARABLE DE ANCHURA ZERO (ZERO-WIDTH NON-BREAKING SPACE, hexadecimal FEFF, también llamado Byte Order Mark, BOM) que, al invertirse los bytes, se convierte en el hexadecimal FFFE, un carácter que nunca será asignado. De este modo, un agente de usuario que reciba un hexadecimal FFFE como los primeros bytes de un texto sabrá que los bytes deben ser invertidos para el resto del texto.

El formato de transformación UTF-1 de [ISO10646] (registrado por IANA como ISO-10646-UTF-1), no debería utilizarse. Para información sobre ISO 8859-8 y el algoritmo bidireccional, consúltese la sección sobre bidireccionalidad y codificación de caracteres.

5.2.2 Especificación de la codificación de caracteres

¿Cómo determina un servidor qué codificación de caracteres se aplica a un documento que está sirviendo? Algunos servidores examinan los primeros bytes del documento, o comprueban una base de datos de ficheros conocidos y sus codificaciones. Muchos servidores modernos dan a los administradores de páginas web más control sobre la configuración de la codificación que los servidores antiguos. Los administradores de páginas deberían usar estos mecanismos para enviar un parámetro "charset" siempre que sea posible, pero con cuidado de no identificar un documento con un valor del parámetro "charset" equivocado.

¿Cómo sabe un agente de usuario qué codificación de caracteres ha sido utilizada? El servidor debería proporcionar esta información. La manera más directa que tiene un servidor para informar al agente de usuario sobre la codificación de caracteres del documento es utilizando el parámetro "charset" del campo "Content-Type" de encabezado del protocolo HTTP ([RFC2616], secciones 3.4 y 14.17). Por ejemplo, el siguiente encabezado HTTP anuncia que la codificación de caracteres es EUC-JP:

Content-Type: text/html; charset=EUC-JP

Consulte la sección sobre conformidad para la definición de text/html.

El protocolo HTTP ([RFC2616], sección 3.7.1) menciona ISO-8859-1 como la codificación de caracteres por defecto cuando el parámetro "charset" esté ausente del campo de encabezado "Content-Type". En la práctica, esta recomendación ha resultado ser inútil, ya que algunos servidores no permiten que se envíe un parámetro "charset", y otros pueden no estar configurados para enviar el parámetro. Por lo tanto, los agentes de usuario no deben suponer ningún valor por defecto para el parámetro "charset".

Para tener en cuenta las limitaciones de los servidores o de sus configuraciones, los documentos HTML pueden incluir información explícita sobre la codificación de caracteres del documento; el elemento META puede utilizarse para proporcionar esta información a los agentes de usuario.

Por ejemplo, para especificar que la codificación de caracteres del documento actual es "EUC-JP", un documento debería incluir la siguiente declaración META:

<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">

La declaración META sólo debe utilizarse cuando la codificación de caracteres se organice de modo que los bytes con valores ASCII correspondan a caracteres ASCII (al menos hasta que se interprete el elemento META). Las declaraciones META deberían aparecer lo antes posible dentro del elemento HEAD.

Para aquellos casos en que ni el protocolo HTTP ni el elemento META proporcionen información sobre la codificación de caracteres de un documento, HTML también proporciona el atributo charset para varios elementos. Combinando todos estos mecanismos, un autor puede asegurarse bastante de que cuando el usuario reciba un recurso, el agente de usuario reconocerá la codificación de caracteres.

En resumen, los agentes de usuario conformes deben tener en cuenta las siguientes prioridades a la hora de determinar la codificación de caracteres de un documento (de prioridad más alta a más baja):

  1. Un parámetro "charset" HTTP en un campo "Content-Type".
  2. Una declaración META con "http-equiv" establecido en "Content-Type" y un valor dado para "charset".
  3. El atributo charset establecido en un elemento que designe un recurso externo.

Además de esta lista de prioridades, el agente de usuario puede usar una heurística y las preferencias del usuario. Por ejemplo, un agente de usuario puede utilizar una heurística para distinguir entre las varias codificaciones utilizadas para textos en japonés. Además, los agentes de usuario tienen normalmente una codificación de caracteres local por defecto y definible por el usuario, que pueden aplicar en ausencia de otros indicadores.

Los agentes de usuario pueden proporcionar un mecanismo que permita a los usuarios invalidar información incorrecta sobre el "charset". Sin embargo, si un agente de usuario ofrece este mecanismo, sólo debería hacerlo para navegar y no para editar, para evitar la creación de páginas web con un parámetro "charset" incorrecto.

Nota. Si, para una aplicación específica, es absolutamente necesario referirse a caracteres que estén fuera de [ISO10646], estos caracteres deberían asignarse a una zona privada para evitar conflictos con versiones presentes o futuras del estándar. De todos modos, esto no se recomienda en absoluto, por motivos de portabilidad.

5.3 Referencias de caracteres

Una codificación de caracteres dada puede no ser capaz de expresar todos los caracteres del conjunto de caracteres del documento. Para tales codificaciones, o cuando las configuraciones de hardware o de software no permitan a los usuarios introducir algunos caracteres del documento directamente, los autores pueden usar referencias de caracteres SGML. Las referencias de caracteres son un mecanismo independiente de la codificación de caracteres para introducir cualquier carácter del conjunto de caracteres del documento.

Las referencias de caracteres en HTML pueden aparecer de dos maneras:

Las referencias de caracteres dentro de comentarios no tienen significado especial; sólo son datos para comentar.

Nota. HTML proporciona otros modos de presentar datos de caracteres, en particular imágenes en línea.

Nota. En SGML, es posible eliminar el ";" final de una referencia de caracteres en algunos casos (p.ej., en un salto de línea o inmediatamente antes de una etiqueta). En otras circunstancias no puede ser eliminado (p.ej., en medio de una palabra). Recomendamos encarecidamente utilizar el ";" en todos los casos para evitar problemas con agentes de usuario que requieran que este carácter esté presente.

5.3.1 Referencias numéricas de caracteres

Las referencias numéricas de caracteres especifican la posición del código de un carácter en el conjunto de caracteres del documento. Las referencias numéricas de caracteres pueden tener dos formas:

A continuación se muestran algunos ejemplos de referencias numéricas de caracteres:

Nota. Aunque la representación hexadecimal no se define en [ISO8879], se espera que lo esté en la revisión, como se describe en [WEBSGML]. Esta convención es particularmente útil ya que los estándares de caracteres suelen utilizar representaciones hexadecimales.

5.3.2 Referencias a entidades de caracteres

Para que los autores tengan una manera más intuitiva de referirse a caracteres del conjunto de caracteres del documento, HTML ofrece un conjunto de referencias a entidades de caracteres. Las referencias a entidades de caracteres utilizan nombres simbólicos para que los autores no tengan que recordar posiciones de código. Por ejemplo, la referencia a la entidad de caracteres &aring; se refiere a la letra minúscula "a" con un anillo ("ring") encima; "&aring;" es más fácil de recordar que &#229;.

HTML 4 no define una referencia a entidades de caracteres para cada carácter del conjunto de caracteres del documento. Por ejemplo, no hay referencia a entidades de caracteres para la letra mayúscula cirílica "I". Consulte la lista completa de referencias de caracteres definidas en HTML 4.

Las referencias a entidades de caracteres sí distinguen entre mayúsculas y minúsculas. Así, &Aring; se refiere a un carácter diferente (A mayúscula con anillo) que &aring; (a minúscula con anillo).

Hay cuatro referencias a entidades de caracteres que merecen mención especial, ya que se usan frecuentemente para transformar ciertos caracteres especiales en secuencias de escape:

Los autores que quieran poner el carácter "<" en el texto deberían usar "&lt;" (ASCII decimal 60) para evitar la posible confusión con el comienzo de una etiqueta (delimitador de apertura de etiqueta inicial). Análogamente, los autores deberían usar "&gt;" (ASCII decimal 62) en el texto en lugar de ">" para evitar problemas con agentes de usuario antiguos que lo interpretan incorrectamente como el final de una etiqueta (delimitador de cierre de una etiqueta) cuando aparece dentro de valores de atributos entrecomillados.

Los autores deberían usar "&amp;" (ASCII decimal 38) en lugar de "&" para evitar la confusión con el comienzo de una referencia de caracteres (delimitador de apertura de una referencia a entidades). Los autores deberían usar también "&amp;" en valores de atributos, ya que las referencias de caracteres están permitidas dentro de valores de atributos CDATA.

Algunos autores usan la referencia a entidades de caracteres "&quot;" para codificar las comillas dobles ("), ya que este carácter puede utilizarse para delimitar los valores de los atributos.

5.4 Caracteres no representables

Un agente de usuario puede no ser capaz de representar correctamente todos los caracteres de un documento, por ejemplo, porque el agente de usuario carezca de una fuente apropiada, porque un carácter tenga un valor que no pueda expresarse con la codificación de caracteres interna del agente de usuario, etc.

Al haber tantas cosas diferentes que pueden hacerse en estos casos, este documento no prescribe ningún comportamiento por defecto. Dependiendo de la implementación, los caracteres no representables pueden también ser tratados por el sistema de presentación subyacente y no por la propia aplicación. En ausencia de un comportamiento más sofisticado, por ejemplo a medida de las necesidades de un script o lenguaje particular, recomendamos el siguiente comportamiento a los agentes de usuario:

  1. Adoptar un mecanismo claramente visible, pero no molesto, para alertar al usuario sobre los recursos ausentes.
  2. Si los caracteres no disponibles se presentan usando su representación numérica, usar la forma hexadecimal (no la decimal), ya que ésta es la forma utilizada en los estándares de conjuntos de caracteres.