Specifiche HTML 4.0/Rappresentazione dei documenti HTML

Rappresentazione dei documenti HTML

../Conformità, requisiti e raccomandazioni ../I tipi di dati elementari in HTML IncludiIntestazione 27 luglio 2010 75% informatica

Rappresentazione dei documenti HTML
Conformità, requisiti e raccomandazioni I tipi di dati elementari in HTML


In questo capitolo esaminiamo come i documenti HTML sono rappresentati in un computer e su Internet.

La sezione sull’insieme di caratteri del documento si occupa di quali caratteri astratti possono far parte di un documento HTML. I caratteri includono la lettera latina "A", la lettera cirillica "I", il carattere cinese che significa "acqua", ecc.

La sezione sulle codifiche dei caratteri si occupa di come quei caratteri possono essere rappresentati in un file o quando vengono trasmessi su Internet. Siccome alcune codifiche dei caratteri non possono rappresentare direttamente tutti i caratteri che un autore può voler includere in un documento, HTML offre altri meccanismi, chiamati referenze al carattere, per riferirsi a qualsiasi carattere.

Dato che ci sono un gran numero di caratteri appartenenti ai linguaggi umani, ed una gran varietà di modi di rappresentarli, si deve porre particolare attenzione affinché i documenti possano essere compresi da interpreti HTML in tutte le parti del mondo.

5.1 L’insieme di caratteri del documento

Per promuovere l’interoperabilità, SGML richiede che ogni applicazione (HTML incluso) specifichi il proprio insieme di caratteri del documento. Un insieme di caratteri del documento è composto da:

  • Un Repertorio: un insieme di caratteri astratti, quali la lettera latina "A", la lettera cirillica "I", il carattere cinese che significa "acqua", ecc.
  • Posizioni di codifica: un insieme di riferimenti interi ai caratteri nel repertorio.

Ciascun documento SGML (incluso ogni documento HTML) è una sequenza di caratteri dal repertorio. I sistemi di computer identificano ciascun carattere con la sua posizione di codifica; per esempio, nell’insieme di caratteri ASCII, le posizioni di codifica 65, 66, e 67 si riferiscono rispettivamente ai caratteri ’A’, ’B’ e ’C’.

L’insieme dei caratteri ASCII non è sufficiente per un sistema informativo globale quale il Web, perciò HTML usa l’insieme di caratteri molto più completo chiamato Universal Character Set (UCS), definito in [ISO10646]. Questo standard definisce un repertorio di migliaia di caratteri usati da comunità da tutte le parti del mondo.

L’insieme di caratteri definito in ISO10646 è equivalente carattere per carattere all’Unicode 2.0 (UNICODE). Entrambi questi standard sono aggiornati di tanto in tanto con nuovi caratteri, e si dovrebbero consultare gli emendamenti sui rispettivi siti Web. Nelle Specifiche correnti, i riferimenti all’ISO/IEC-10646 o all’Unicode indicano lo stesso insieme di caratteri del documento. Tuttavia, le Specifiche HTML si riferiscono alle Specifiche Unicode anche per altre questioni, quali l’algoritmo per testo bidirezionale.

L’insieme di caratteri del documento, comunque, non è sufficiente per permettere agli interpreti HTML una corretta interpretazione dei documenti così come sono tipicamente scambiati -- codificati come una sequenza di byte in un file o nel corso di una trasmissione via rete. Gli interpreti HTML devono conoscere anche la particolare codifica dei caratteri che è stata usata per trasformare la sequenza di caratteri del documento in una sequenza di byte.

5.2 Codifiche dei caratteri

Ciò che queste Specifiche chiamano codifica dei caratteri è noto con nomi differenti in altre specifiche (il che può creare confusione). Tuttavia il concetto è in larga misura lo stesso da un capo all’altro di Internet. Inoltre le intestazioni di protocollo, gli attributi ed i parametri che si riferiscono alle codifiche dei caratteri condividono lo stesso nome -- "charset" -- e usano gli stessi valori dal registro IANA (si veda CHARSETS per un elenco completo).

Il parametro "charset" identifica una codifica dei caratteri, che è un metodo per convertire una sequenza di byte in una sequenza di caratteri. Questa conversione corrisponde in modo naturale allo schema di attività del Web: i server inviano i documenti HTML agli interpreti HTML come un flusso di byte; gli interpreti HTML li interpretano come una sequenza di caratteri. Il metodo di conversione può variare da semplice corrispondenza uno-a-uno a schemi di sostituzione complessi o algoritmi.

Una semplice tecnica di codifica un-byte-per-carattere non è sufficiente per stringhe di testo basate su un repertorio di caratteri ampio quanto ISO10646. Vi sono molte codifiche differenti di parti di ISO10646 in aggiunta a codifiche dell’intero insieme di caratteri (quali l’UCS-4).

5.2.1 Scegliere una codifica

Gli strumenti di creazione (ad es., gli editori di testo) possono codificare i documenti HTML in una codifica dei caratteri di loro scelta, e questa scelta dipende largamente dalle convenzioni usate dal software di sistema. Questi strumenti possono usare una qualsiasi conveniente codifica che includa la maggior parte dei caratteri contenuti nel documento, a patto che la codifica sia specificata correttamente. Quei caratteri occasionali che non rientrano nella codifica possono ugualmente essere rappresentati per mezzo delle referenze al carattere. Queste si riferiscono sempre all’insieme di caratteri del documento, e non alla codifica dei caratteri.

I server e i proxy server possono cambiare una codifica dei caratteri (ciò viene detto transcodifica) sull’istante per soddisfare le richieste degli interpreti HTML (si veda la sezione 14.2 di RFC2068, intestazione HTTP di richiesta "Accept-Charset"). I server e i proxy server non sono tenuti a servire un documento in una codifica dei caratteri che ricopra l’intero insieme di caratteri del documento.

Codifiche dei caratteri comunemente usate sul Web includono l’ISO-8859-1 (conosciuto anche come "Latin-1"; utilizzabile per la maggior parte delle lingue europee occidentali), l’ISO-8859-5 (che supporta il Cirillico), lo SHIFT_JIS (una codifica giapponese), l’EUC-JP (un’altra codifica giapponese), e l’UTF-8 (una codifica dell’ISO 10646 che usa un numero di byte differente per caratteri differenti). I nomi delle codifiche dei caratteri sono insensibili alla forma maiuscola/minuscola delle lettere che li specificano, così che, per esempio, "SHIFT_JIS", "Shift_JIS", e "shift_jis" sono equivalenti.

Queste Specifiche non regolano quali codifiche dei caratteri un interprete HTML debba supportare.

Gli interpreti HTML conformi devono mappare correttamente in Unicode tutti i caratteri in tutte le codifica dei caratteri che essi riconoscono (o devono comportarsi come se lo avessero fatto).

Note su particolari codifiche
Quando si trasmette testo HTML in UTF-16 (charset=UTF-16), i dati del testo dovrebbero essere trasmessi secondo l’ordine di byte di rete ("big-endian", il byte di ordine maggiore per primo) in conformità con [ISO10646], sezione 6.3 e [UNICODE], clausola C3, pagina 3-1.

Inoltre, per massimizzare le possibilità di una corretta interpretazione, si raccomanda che i documenti trasmessi come UTF-16 inizino sempre con un carattere ZERO-WIDTH NON-BREAKING SPACE (valore esadecimale FEFF, detto anche Byte Order Mark (BOM)) che, rovesciando l’ordine dei byte, diventa valore esadecimale FFFE, un carattere che è garantito non essere mai assegnato. In questo modo, un interprete HTML che riceve un esadecimale FFFE come primo byte di un testo riconoscerebbe che i byte debbono essere rovesciati per la parte residua del testo.

Il formato di trasformazione UTF-1 dell’ISO10646 (registrato da IANA come ISO-10646-UTF-1), non dovrebbe essere usato. Per informazioni sull’ISO 8859-8 e sull’algoritmo bidirezionale, si consulti la sezione sulla bidirezionalità e codifica dei caratteri.

5.2.2 Specificare la codifica dei caratteri

Come fa un server a determinare quale codifica dei caratteri si applica ad un documento da lui servito? Alcuni server esaminano i primi byte del documento, o controllano rispetto ad un database di file e di codifiche noti. Molti server recenti danno ai gestori del Web più controllo sulla configurazione del parametro charset di quello che fanno i server più vecchi. I gestori del Web dovrebbero usare questi meccanismi per trasmettere un parametro "charset" ogni volta che è possibile, ma dovrebbero fare attenzione a non identificare un documento con il valore del parametro "charset" sbagliato.

Come fa un interprete HTML a sapere quale codifica dei caratteri è stata usata? È il server che dovrebbe fornire questa informazione. Il modo più diretto per un server di informare l’interprete HTML sulla codifica dei caratteri del documento è quello di usare il parametro "charset" del campo di intestazione "Content-Type" del protocollo HTTP. (RFC2068, sezioni 3.4 e 14.18). Per esempio, la seguente intestazione HTTP annuncia che la codifica dei caratteri è EUC-JP:

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

Si consulti la sezione sulla conformità per la definizione di text/html.

Il protocollo HTTP (RFC2068, sezione 3.7.1) cita l’ISO-8859-1 come una codifica dei caratteri di default quando il parametro "charset" è assente dal campo di intestazione "Content-Type". In pratica questa raccomandazione si è dimostrata inutile perché alcuni server non consentono l’invio di un parametro "charset" e altri possono non essere configurati per inviare il parametro. Pertanto gli interpreti HTML non devono assumere alcun valore di default per il parametro "charset".

Per andare incontro alle limitazioni dei server o delle loro configurazioni, i documenti HTML possono includere informazioni esplicite riguardanti la codifica dei caratteri; l’elemento META può essere utilizzato per fornire agli interpreti HTML queste informazioni.

Per esempio, per specificare che la codifica dei caratteri del documento corrente è "EUC-JP", un documento dovrebbe includere la seguente dichiarazione META:

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

La dichiarazione META deve essere usata unicamente quando la codifica dei caratteri è organizzata in modo tale che i caratteri ASCII rappresentano sé stessi (almeno fino a che l’elemento META sia analizzato). Le dichiarazioni META dovrebbero apparire prima possibile nell’elemento HEAD.

Per i casi in cui né il protocollo HTTP né l’elemento META forniscano informazioni sulla codifica dei caratteri di un documento, HTML fornisce anche l’attributo charset su numerosi elementi. Combinando questi meccanismi, un autore può aumentare notevolmente la possibilità che, quando l’utente ritrova una risorsa, l’interprete HTML riconosca la codifica dei caratteri.

Per riassumere, gli interpreti HTML conformi devono osservare le seguenti priorità nel determinare la codifica dei caratteri di un documento (in ordine descrescente di priorità):

  1. Un parametro HTTP charset in un campo Content-Type.
  2. Una dichiarazione META con http-equiv impostato a Content-Type e un valore assegnato a charset.
  3. L’attributo charset impostato in un elemento che indica una risorsa esterna.

In aggiunta a questa lista di priorità, l’interprete HTML può usare euristiche e impostazioni di utente. Per esempio, molti interpreti HTML usano un’euristica per distinguere le varie codifiche usate per testo giapponese. Inoltre, gli interpreti HTML tipicamente hanno una codifica dei caratteri locale predefinita, impostabile dall’utente, che essi applicano in assenza di altri indicatori.

Gli interpreti HTML possono fornire un meccanismo che permette agli utenti di anullare informazioni charset incorrette. Tuttavia, se un interprete HTML fornisce un tale meccanismo, deve offrirlo solo per la navigazione e non per la composizione, per evitare la creazione di pagine Web marcate con un parametro charset incorretto.

Nota. Se, per una specifica applicazione, diventa necessario riferirsi a caratteri al di fuori dell’ISO10646, i caratteri dovrebbero essere assegnati ad una zona privata per evitare conflitti con versioni presenti o future dello standard. Questo, comunque, è altamente scoraggiato, per ragioni di portabilità.

5.3 Referenze al carattere

Una data codifica dei caratteri può non essere in grado di esprimere tutti i caratteri dell’insieme di caratteri del documento. Per tali codifiche, o quando le configurazioni hardware o software non permettono agli utenti di inserire direttamente determinati caratteri, gli autori possono utilizzare le referenze al carattere SGML. Le referenze al carattere sono un meccanismo, indipendente dalla codifica dei caratteri, per immettere qualsiasi carattere dall’insieme di caratteri di un documento.

Le referenze al carattere in HTML possono apparire in due forme:

  • Referenze al carattere numeriche (decimali oppure esadecimali).
  • Referenze al mediante entità carattere.

Le referenze al carattere all’interno dei commenti non hanno alcun significato speciale; sono solo dati di commento.

Nota. L’HTML fornisce altri modi di presentare dati di tipo carattere, in particolare le immagini in linea.
Nota. In SGML, è possibile eliminare il ";" finale dopo una referenza al carattere in alcuni casi (ad es., a fine riga, o immediatamente prima di un tag). In altri casi non può essere eliminato (ad es., nel mezzo di una parola). Si raccomanda di usare sempre il ";" per evitare problemi con quegli interpreti HTML che richiedono la presenza di questo carattere.

5.3.1 Referenze al carattere numeriche

Le referenze al carattere numeriche specificano la posizione di codifica di un carattere nell’insieme di caratteri del documento. Le referenze al carattere numeriche possono assumere due forme:

  • La sintassi &#D;, dove D è un numero decimale, si riferisce al numero di carattere decimale D dell’Unicode.
  • La sintassi &#xH; o &#XH;, dove H è un numero esadecimale, si riferisce al numero di carattere esadecimale H dell’Unicode. I numeri esadecimali nelle referenze al carattere sono insensibili alla forma maiuscola/minuscola delle lettere che li specificano.

Ecco alcuni esempi di referenze al carattere numeriche:

  • &#229; (in decimale) rappresenta la lettera "a" con un piccolo cerchio sopra (usata, per esempio, in norvegese).
  • &#xE5; (in esadecimale) rappresenta lo stesso carattere.
  • &#Xe5; (in esadecimale) rappresenta ancora lo stesso carattere.
  • &#1048; (in decimale) rappresenta la lettera cirillica maiuscola "I".
  • &#x6C34; (in esadecimale) rappresenta il carattere cinese che indica l’acqua.
Nota. Sebbene la rappresentazione esadecimale non sia definita nell’ISO8879, ci si aspetta che lo sarà nella revisione finale.

5.3.2 Referenze al carattere mediante entità carattere

Per dare agli autori un modo più intuitivo per riferirsi ai caratteri dell’insieme di caratteri del documento, l’HTML offre un insieme di referenze al carattere mediante entità carattere. Le referenze al carattere mediante entità carattere usano nomi simbolici così che l’autore non deve ricordare la posizione di codifica. Per esempio, la referenza al carattere mediante l’entità carattere &aring; si riferisce al carattere "a" minuscolo sormontato da un anello; &aring; è più facile da ricordare di &#229;.

L’HTML 4.0 non definisce una referenza di entità carattere per ogni carattere dell’insieme di caratteri del documento. Per esempio, non c’è una referenza di entità carattere per la lettera cirillica maiuscola "I". Si consulti l’elenco completo delle referenze al carattere mediante entità carattere definite in HTML 4.0.

Le referenze al carattere mediante entità carattere sono sensibili alla forma maiuscola/minuscola delle lettere che le specificano. Quindi, &Aring; si riferisce a un carattere (A maiuscola con anello) diverso da &aring; (a minuscola con anello).

Quattro referenze al carattere mediante entità carattere meritano una menzione speciale, dato che sono usate spesso per evitare caratteri speciali:

  • &lt; rappresenta il segno <.
  • &gt; rappresenta il segno >.
  • &amp; rappresenta il segno &.
  • &quot; rappresenta il segno di interpunzione ".

Gli autori che desiderano inserire il carattere "<" nel testo dovrebbero usare &lt; (ASCII decimale 60) per evitare possibili confusioni con l’inizio di un tag (delimitatore di apertura del tag di inizio). Analogamente, gli autori dovrebbero usare &gt; (ASCII decimale 62) nel testo invece di ">" per evitare problemi con gli interpreti HTML più vecchi che interpretano erroneamente questo carattere come la fine di un tag (delimitatore di chiusura del tag) quando esso appare tra virgolette nei valori di attributo.

Gli autori dovrebbero usare &amp; (ASCII decimale 38) invece di "&" per evitare confusione con l’inizio di una referenza al carattere mediante entità carattere (delimitatore di apertura di referenze al carattere mediante entità carattere). Gli autori dovrebbero anche usare &amp; nei valori di attributo dato che le referenze al carattere mediante entità carattere sono permesse nei valori di attributo CDATA.

Alcuni autori usano la referenza al carattere mediante entità carattere &quot; per codificare le istanze del segno di interpunzione doppie virgolette (") dato che quel carattere può essere usato per delimitare i valori di attributo.

5.4 Caratteri non visualizzabili

Un interprete HTML può non essere in grado di riprodurre tutti i caratteri in un documento in maniera significativa, ad esempio, perché l’interprete HTML manca di un carattere appropriato, un carattere ha un valore che non può essere espresso nella codifica dei caratteri interna dell’interprete HTML, ecc.

Poiché vi sono molte cose che possono essere fatte in questi casi, questo documento non prescrive alcun comportamento specifico. A seconda dell’implementazione, i caratteri non visualizzabili possono anche essere gestiti dal sistema di visualizzazione sottostante e non dall’applicazione stessa. In assenza di un comportamento più sofisticato, per esempio ritagliato alle le necessità di un particolare sistema di scrittura o una lingua, si raccomanda il seguente comportamento per gli interpreti HTML:

  1. Adottare un meccanismo chiaramente visibile, ma non fastidioso, per allertare l’utente delle risorse mancanti.
  2. Se i caratteri mancanti sono presentati usando la loro rappresentazione numerica, usare la forma esadecimale (non quella decimale), dato che questa è la forma usata negli standard degli insiemi di caratteri.