5 Representación de documentos en HTML

Índice

  1. O conxunto de caracteres do documento
  2. Codificacións de caracteres
    1. Escoller unha codificación
    2. Especicación da codificación de caracteres
  3. Referéncias a caracteres
    1. Referéncias numéricas a caracteres
    2. Referéncias a entidades-carácter
  4. Caracteres non representábeis

Neste capítulo trataremos como se representan os documentos HTML nun computador e na Internet.

A sección sobre o conxunto de caracteres do documento trata sobre que caracteres abstractos poden facer parte dun documento HTML. Un carácter inclue a letra latina "A", a letra cirílica "I", o carácter chinés que significa "auga", etc.

A sección sobre codificacións de caracteres trata de como eses caracteres poden ser representados nun ficheiro ou cando se transmiten pola Internet. Dado que algunhas codificacións de carácter non poden representar directamente todos os caracteres que un autor queira incluir nun documento, HTML oferece outros mecanismos, chamados referéncias de carácter , para se referir a calquer carácter.

Dado que as línguas naturais usan un grande número de caracteres e moitas maneiras diferentes de representar eses caracteres, hai que ter tento para que os documentos sexan comprendidos polos axentes de usuário de todo o mundo.

5.1 O conxunto de caracteres do documento

Para promover a inter-operatibilidade, a SGML require que cada aplicación (incluindo HTML) especifique o seu conxunto de caracteres do documento. Un conxunto de caracteres do documento consiste en:

Cada documento SGML (incluído cada documento HTML) é unha secuéncia de caracteres do repertório. Os sistemas informáticos identifican cada carácter pola súa posición de código; por exemplo, no conxunto de caracteres ASCII, as posicións de código 65, 66 e 67 referen-se aos caracteres 'A', 'B' e 'C' respectivamente.

O conxunto de caracteres ASCII non abonda para un sistema de información global tal como a Web, asi que a HTML usa un conxunto de caracteres moito máis completo chamado Conxunto universal de caracteres (UCS), definido en [ISO10646] . Este padrón define un repertório de miles de caracteres que usan comunidades de todo o mundo.

O conxunto de caracteres definido en [ISO10646] é equivalente carácter a carácter ao Unicode ( [UNICODE] ). Ambos os dous padróns actualizan-se cada certo tempo con caracteres novos e as alteracións hai-nas que consultar nos sítios Web respectivos. Nesta especifiación, usa-se "[ISO10646]" para referir-se ao conxunto de caracteres do documento mentres "[UNICODE]" reserva-se para as referéncias ao algoritmo de texto bidireccional .

O conxunto de caracteres do documento, porén, non abonda para lles permitir aos axentes de usuário interpretar correctamente os documentos HTML tal e como se intercámbian normalmente -- codificados como unha secuéncia de bytes nun ficheiro ou durante unha transmisión de rede. Os axentes de usuário deben tamén coñecer a codificación de caracteres que se usou para transformar o fluxo de caracteres do documento nun fluxo de bytes.

5.2 Codificacións de caracter es

O que esta especifiación denomina codificación de carácteres recebe distintos nomes noutras especificacións (o que pode causar confusión). Porén, o conceito é basicamente o mesmo en Internet. Asi mesmo, os cabezallos de protocolo, atributos e parámetros que se refiren a codificacións de carácter compartillan o mesmo nome -- "charset" -- e usan os mesmos valores do rexistro da [IANA] (consulte [CHARSETS] se quere unha lista completa).

O parámetro "charset" identifica unha codificación de caracteres, que é un método para converter unha secuéncia de bytes nunha secuéncia de caracteres. Esta conversión axusta-se naturalmente ao esquema da actividade Web: os servidores envian documentos HTML a axentes de usuário como un fluxo de bytes; os axentes de usuário interpretan-nos como unha secuéncia de caracteres. O método de conversión pode abarcar desde unha correspondéncia un a un a esquemas de transformación complexos ou algoritmos.

Unha técnica simples de codificación de un byte por carácter non chega para secuéncias de texto sobre un repertório de caracteres tan grande como o [ISO10646] . Hai várias codificacións diferentes de partes do [ISO10646] ademáis de codificacións do conxunto de caracteres inteiro (tais como UCS-4).

 

5.2.1 Escoller unha codificación

As ferramentas de creación (p.ex. editores de texto) poden codificar os documentos HTML nunha codificación de caracteres decidida por elas e esa escolla depende en boa medida das convencións usadas polo software do sistema. Esas ferramentas poden empregar calquer codificación apropriada que abarque a maioria dos caracteres contidos no documento sempre que a codificación estexa etiquetada correctamente. Pode-se representar o mesmo algun que outro carácter que non entre nesa codificación usando referéncias de carácter . Estas sempre se refiren ao conxunto de caracteres do documento, non à codificación dos caracteres.

Os servidores e proxies poden mudar unha codificación de caracteres (o que se chama transcodificación) ao voo, para asi respostaren às peticións dos axentes de usuário (ver a sección 14.2 de [RFC2616] , o cabezallo de petición "Accept-Charset" de HTTP). Os servidores e proxies non teñen por que facilitar un documento nunha codificación de caracteres que abarque o conxunto completo de caracteres do documento.

Algunhas codificacións de caracteres usadas con frecuéncia na Web incluen ISO-8859-1 (coñecida tamén como "Latin-1"; que usan moitas línguas da Europa Ocidental), ISO-8859-5 (que permite o alfabeto cirílico), SHIFT_JIS (unha codificación xaponesa), EUC-JP (outra codificación xaponesa), e UTF-8 (unha codificaión de ISO 10646 que usa un número diferente de bytes para caracteres distintos). Os nomes das codificacións de caracteres non distinguen entre maiúsculas e minúsculas, de xeito que, por exemplo "SHIFT_JIS", "Shift_JIS", e "shift_jis" son equivalentes.

Esta especificación non impón que codificacións de caracteres debe usar un axente de usuário.

Os axentes de usuário que sexan conformes deben trazar correctamente à ISO 10646 todas as codificacións de caracteres que recoñezan (ou comportaren-se como se o fixeren).

 

Notas sobre determinadas codificacións 

Cando un texto HTML se transmite en UTF-16 (charset=UTF-16), os dados de texto deben ser transmitidos en orde de bytes de rede ("big-endian", o byte de maior orde primeiro) dacordo con [ISO10646] , Sección 6.3 e [UNICODE] , artigo C3, páxina 3-1.

Ademáis, para aumentar as posibilidades dunha interpretación apropriada, recomenda-se que os documentos que se transmitan como UTF-16 comecen sempre cun carácter de ESPAZO NON SEPARADOR de ANCHO CERO (FEFF hexadecimal, coñecido tamén como Marca de Orde de Byte (BOM) que, ao invertir-se o byte, transforma-se en FFFE, un carácter que nunca se vai asignar. Deste xeito, un axente usuário que receba un FFFE hexadecimal como primeiros bytes do texto saberá que os bytes teñen que ser invertidos no resto do texto.

O formato de transformación UTF-1 do [ISO10646] (rexistrado pola IANA como ISO-19646-UTF-1), non deberia ser usado. Para máis información sobre ISO 8859-8 e o algoritmo bidireccional, consulte a sección sobre bidireccionalidade e codificación de caracteres .

 

5.2.2 Especificación da codificación de caracteres

Como é que determina un servidor que codificación de caracteres debe aplicar para un documento que sirva? Alguns servidores examinan os primeiros bytes do documentos ou comproban un banco de dados de ficheiros e codificacións coñecidos. Moitos servidores modernos dan-lles aos web masters maior control sobre a configuración de charset que outros servidores máis antigos. Os web masters deberian usar sempre que puderen eses mecanismos que envian un parámetro "charset", mais deberian ter tento en non identificar un documento cun valor do parámetro "charset" errado.

Como fai un axente de usuário para saber que codificación de caracteres se usou? O servidor debe fornecer esta información. O xeito máis directo de que un servidor informe ao axente de usuário sobre a codificación de caracteres do documento é mediante o uso do parámetro "charset" no campo de cabezallo "Content-Type" do protocolo HTTP ( [RFC2616] , seccións 3.4 e 14.17). Por exemplo, o cabezallo HTTP seguinte anúncia que a codificación de caracteres é EUC-JP:

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

Pode consultar a sección sobre conformidade se necesitar a definición de text/html .

O protocolo HTTP ( [RFC2616] , sección 3.7.1) menciona ISO-8859-1 como codificación de caracteres por omisión cando o parámetro "charset" está ausente do campo de cabezallo "Contet-Type". Na práctica, esta recomendación resulta inútil porque alguns servidores non permiten que se envie un parámetro "charset" e outros poden non estar configurados para enviar o parámetro. Polo tanto, os axentes de usuário non deben asumir un valor por omisión do parámetro "charset".

Para confrontar as limitacións no servidor ou na sua configuración, os documentos HTML poden incluir información explícita sobre a codificación de caracteres do documento; o elemento META pode-se usar para fornecer-lles esta información aos axentes de usuário.

Por exemplo, para indicar que a codificación de caracteres do documento actual é "EUC-JP", un documento deberia incluir a seguinte declaración META :

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

A declaración META só debe ser usada cando a codificación de caracteres se organice de tal maneira que os bytes de valor ASCII representen caracteres ASCII (cando menos até que o elemento META se procese). As declaracións META deberian aparecer o máis axiña posíbel no elemento HEAD .

Nos casos nos que nen o protocolo HTTP nen o elemento HEAD fornezan información sobre a codificación de caracteres dun documento, a HTML fornece tamén o atributo charset para vários elementos. Combinando estes mecanismos, un autor pode mellorar en grande medida as oportunidades de que, cando o usuário recupere un recurso, o axente de usuario recoñeza a codificación de caracteres.

En resumo, os axentes de usuário que sexan conformes deben observar as seguintes prioridades à hora de determinaren a codificación de caracteres dun documento (de maior prioridade a menor):

  1. Un parámetro "charset" de HTTP nun campo "Content-Type".
  2. Unha declaración META con"http-equiv" a indicar "Content-Type" e cun valor para "charset".
  3. O atributo charset a indicar un elemento que designa un recurso externo.

Ademáis desta lista de prioridades, o axente de usuário pode usar a heurística e axustamentos do usuário. Por exemplo, moitos axentes de usuário usan unha heurística para distinguir as distintas codificacións que se usan para os textos en xaponés. Asi mesmo, os axentes de usuário normalmente dispoñen dunha codificación de caracteres local por omisión definida polo usuário que aplican na auséncia doutros indicadores.

Os axentes de usuário poden fornecer un mecanismo que lles permita aos usuários sobrepor información de "charset" incorrecta. Porén, se un axente de usuário oferece tal mecanismo, só deberia oferecé-lo para navegar e non para editar, para asi evitar a creación de páxinas web marcadas cun parámetro "charset" incorrecto.

Nota. Se, para unha aplicación específica, se fixer necesário referir-se a caracteres que estiveren fora do [ISO10646] , os caracteres deberian-se asignar a unha zona privada que evite conflitos con versións presentes ou futuras do padrón. Non se recomenda en absoluto, porén, por razóns de portabilidade.

 

5.3 Referéncias a caracter es

Unha codificación de caracteres dada pode non ser capaz de representar todos os caracteres do conxunto de caracters do documento. Para tais codificacións, ou cando as configuracións de hardware ou software non permitan que os usuários introduzan alguns caracteres directamente, os autores poden usar referéncias de carácter da SGML. As referéncias a caracteres son un mecanismo de carácter independente da codificación para introducir calquer carácter do conxunto de caracteres do documento.

As referéncias a caracteres poden aparecer de duas maneiras en HTML:

As referéncias a caracteres dentro dos comentários non teñen un significado especial; son só dados de comentário.

Nota. A HTML fornece outras maneiras de apresentar dados de carácter, en particular as imaxes integradas .

Nota. Na SGML, é posíbel eliminar o ";" final após unha referéncia a un carácter nalguns casos (p.ex., nun remate de liña ou imediatamente antes dunha etiqueta). Noutras circunstáncias non poden ser eliminados (p.ex., no meio dunha palabra). Recomenda-se encarecidamente que se use o ";" en todos os casos para evitar problemas con axentes de usuario que requiran a presenza deste carácter.

5.3.1 Referéncias numéricas a caracteres

As referéncias numéricas a caracteres indican a posición no código dun carácter no conxunto de caracteres do documento. As referéncias numéricas a caracteres poden tomar duas formas:

Velaí alguns exemplos de referéncias numéricas a caracteres:

Nota. Ainda que a representación decimal non se define en [ISO8879] , agarda-se que estexa na revisión, como se descrebe en [WEBSGML] . Esta convención resulta particularmente útil xa que os padróns de caracteres normalmente utilizan representacións hexadecimais.

5.3.2 Referéncias a entidades-carácter

Co intuito de lles fornecer aos autores un xeito máis intuitivo de se referir aos caracteres do conxunto de caracteres do documento, a HTML oferta un conxunto de referéncias a entidades-carácter. As referéncias a entidades-carácter utilizan nomes simbólicos para que os autores non teñan que lembar as posicións de código . Por exemplo, a referéncia à entidade-carácter &aring; refire-se ao carácter "a" minúsculo cun círculo na parte superior; "&aring;" é máis doado de lembrar que &#229; xa que "ring" significa "círculo" en inglés.

HTML 4 non define unha referéncia a entidade-carácter para cada carácter do conxunto de caracteres do documento. Por exemplo, non hai unha referéncia a entidade-carácter para a letra cirílica "I" maiúsculo. Consulte a lista completa de referéncias de caracteres defidas en HTML 4.

As referéncias a entidades-carácter distinguen entre maiúsculas e minúsculas. Asi, &Aring; refire-se a un carácter diferente (A maiúsculo con círculo) que &aring; (a minúsculo con círculo).

Hai catro referéncias a entidades-carácter que merecen unha mención especial dado que se usan con frecuéncia para escapar caracteres especiais:

Os autores que queiran pór o carácter "<" nun texto deben usar "&lt;" (ASCII decimal 60) para evitaren a posíbel confusión co comezo dunha etiqueta (delimitador aberto de início de etiqueta). Do mesmo xeito, os autores deben usar "&gt;" (decimal 62 ASCII) nun texto en vez de ">" para evitaren problemas con axentes de usuário antigos que interpreten isto incorrectamente como o final dunha etiqueta (delimitador de encerramento de etiqueta) cando aparece en valores de atributo entre aspas.

Os autores deben usar "&amp;" (decimal 38 ASCII) no canto de "&" para evitaren a confusión co comezo dunha referéncia a un carácter (delimitador aberto de referéncia de entidade). Os autores deben tamén usar "&amp;" nos valores de atributo xa que as referéncias a caracteres se permiten en valores de atributos dentro de CDATA .

Alguns autores usan a referéncia de entidade de carácter "&quot;" para codificar as aspas dobres (") xa que ese carácter pode ser usado para delimitar valores de atributos.

5.4 Caracteres non representábeis

Un axente de usuário pode non ser capaz de representar todos os caracteres dun documento dunha maneira aceitábel, por exemplo porque o axente de usuário careza do tipo de letra adecuado, un carácter posua un valor que non se pode expresar mediante a codificación de caracteres interna do axente de usuário, etc.

Dado que nestes casos se poden facer moitas cousas distintas, este documento non prescrebe nengun comportamento específico. Dependendo da implementación, os caracteres non representábeis poden ser manipulados tamén polo sistema de representación sub-xacente e non pola própria aplicación. Na auséncia dun comportamento máis sofisticado, por exemplo à medida das necesidades dun script ou linguaxe concreta, recomendamos o seguinte comportamento para os axentes de usuário:

  1. Adoptar un mecanismo claramente visíbel, pero non molesto, de avisar ao usuário de que faltan alguns recursos.
  2. Se os caracteres que faltan se apresentan mediante a sua representación numérica, usar a forma hexadecimal (non a decimal), dado que esta é a forma utilizada nos padróns de conxuntos de caracteres.