5 Rappresentazione di documenti HTML

Argomenti

  1. L'insieme dei caratteri di un documento
  2. Codifiche dei caratteri
    1. Scegliere una codifica
    2. Specificare la codifica dei caratteri
  3. Riferimenti ai caratteri
    1. Riferimenti numerici ai caratteri
    2. Riferimenti ad entità di caratteri
  4. Caratteri non visualizzabili

In questo capitolo si discute come sono rappresentati i documenti HTML sui computer e su Internet.

Il paragrafo sull'insieme dei caratteri di un documento si occupa di quali caratteri astratti possono essere parte di un documento HTML. Esempi di caratteri sono la lettera latina "A", la lettera cirillica "I", il carattere cinese che significa "acqua", ecc.

Il paragrafo sulle codifiche dei caratteri introduce su come i caratteri possono essere rappresentati in un file o quando vengono trasmessi via Internet. Poiché alcune codifiche dei caratteri possono non rappresentare direttamente tutti i caratteri che un autore può voler includere in un documento, l'HTML offre altri metodi, chiamati riferimenti ai caratteri, per riferire qualunque carattere.

Poiché ci sono tanti differenti caratteri nei linguaggi umani, ed una gran varietà di modi di rappresentarli, si deve porre attenzione così che i documenti siano ben capiti da tutti gli interpreti HTML.

5.1 L'insieme dei caratteri di un documento

Per promuovere l'interoperabilità, l'SGML richiede che ogni applicazione (HTML incluso) specifichi il proprio insieme dei caratteri del documento. Un insieme di caratteri di un documento, d'ora in poi solo insieme dei caratteri, consiste di:

Ogni documento SGML (inclusi quelli HTML) è una sequenza di caratteri del repertorio. I computer identificano ogni carattere con il relativo codice di posizione. Per esempio, nell'insieme dei caratteri ASCII, i codici di posizione 65, 66, e 67 si riferiscono rispettivamente ai caratteri 'A', 'B' e 'C'.

L'insieme dei caratteri ASCII non è sufficiente per un sistema di informazioni globale come il Web, e quindi l'HTML usa un insieme di caratteri più completo, chiamato Insieme dei Caratteri Universale (UCS), definito in [ISO10646]. Questo standard definisce un repertorio di migliaia di caratteri usati da comunità sparse in tutto il mondo.

L'insieme dei caratteri definito in [ISO10646] è equivalente carattere per carattere all'Unicode 2.0 ([UNICODE]). Entrambi questi standard sono aggiornati periodicamente con nuovi caratteri, e se ne trovano gli aggiornamenti ai rispettivi Website. Nella specifica corrente, i riferimenti all'ISO/IEC-10646 o all'Unicode indicano lo stesso insieme di caratteri. Tuttavia, la specifica dell'HTML fa riferimento alla specifica Unicode per altri argomenti, come l'algoritmo di testo bidirezionale.

L'insieme dei caratteri, tuttavia, non è sufficiente per una corretta interpretazione dei documenti HTML così come sono tipicamente trasmessi -- codificati come una sequanza di byte in un file, o in una trasmissione via rete. Gli interpreti HTML devono anche conoscere la specifica codifica dei caratteri usata per trasformare i caratteri del documento in una sequenza di byte.

5.2 Codifiche dei caratteri

Ciò che questa specifica chiama codifica dei caratteri va sotto differenti nomi in altre specifiche (ciò può causare confusione). Tuttavia, su tutta Internet, il concetto è pressoché lo stesso. Inoltre, le intestazioni dei protocolli, gli attributi, ed i parametri che si riferiscono a codifiche dei caratteri condividono tutti lo stesso nome --"insieme dei caratteri" ("charset") -- ed usano gli stessi valori dal registro [IANA] (per una lista completa, si veda [CHARSETS].

Il parametro "charset" identifica una codifica dei caratteri, che è un metodo per convertire una sequenza di byte in una sequenza di caratteri. Questa conversione risponde in maniera naturale allo schema delle attività Web: i server mandano agli interpreti HTML i documenti HTML come un flusso di byte; gli interpreti HTML li interpretano come una sequenza di caratteri. Il metodo di conversione varia dalla semplice corrispondenza uno-a-uno a schemi di conversione o algoritmi più complessi.

Una semplice tecnica di codifica un-byte-per-carattere non è sufficiente per stringhe di testo basate su un repertorio di caratteri grande quanto [ISO10646]. Ci sono diverse codifiche di parti dello [ISO10646] in aggiunta a codifiche dell'intero insieme dei caratteri (come l'UCS-4).

5.2.1 Scegliere una codifica

Gli strumenti di authoring (come gli editor di testo) possono codificare i documenti HTML usando una codifica dei caratteri di loro scelta, e questa scelta dipende largamente dalle convenzioni usate dal software di sistema. Questi strumenti di authoring possono usare qualunque codifica che abbia la maggior parte dei caratteri contenuti nel documento, a patto che la codifica sia etichettata correttamente. Quei caratteri che occasionalmente non siano presenti nella codifica possono comunque essere rappresentati da riferimenti ai caratteri. Questi si riferiscono sempre all'insieme dei caratteri, e non alla codifica dei caratteri.

I server ed i proxy server possono cambiare codifica dei caratteri (ciò è detto transcodifica) mentre li ricevono per venire incontro alle richieste degli interpreti HTML (si veda il paragrafo 14.2 di [RFC2068], intestazione di richiesta HTTP "Accept-Charset"). I server ed i proxy server non devono trattare documenti che usano codifiche dei caratteri che considerino l'intero insieme dei caratteri.

Tra le codifiche dei caratteri comunemente usate nel Web troviamo l'ISO-8859-1 (conosciuto anche come "Latin-1"; utilizzabile nella magigor parte delle lingue dell'Europa occidentale), l'ISO-8859-5 (che supporta il Cirillico), SHIFT_JIS (o codifica giapponese), EUC-JP (un'altra codifica giapponese), e l'UTF-8 (una codifica dell'ISO 10646 che usa un numero di bit differente per differenti caratteri). I nomi delle codifiche dei caratteri sono maiuscolo indifferenti, così che, per esempio, "SHIFT_JIS", "Shift_JIS", e "shift_jis" sono equivalenti.

Questa specifica non stabilisce quale codifica di caratteri debba essere supportata da un interprete HTML.

Gli interpreti HTML conformi devono far corrispondere correttamente all'Unicode tutti i i caratteri in qualsiasi codifica dei caratteri essi riconoscano (o devono comportarsi come se lo avessero fatto).

Note su codifiche specifiche 

Quando si trasmette testo HTML in UTF-16 (charset=UTF-16), i dati del testo dovrebbero essere trasmessi in ordine di byte di rete ("big-endian", prima il byte di ordine maggiore) in accordo con [ISO10646], paragrafo 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 comincino sempre con un carattere ZERO-WIDTH NON-BREAKING SPACE (codice esadecile FEFF, detto anche Byte Order Mark (BOM)) che, quando capovolto (byte-reversed), assume il codice esadecimale FFFE che è un carattere che non è mai assegnato. Così, l'interprete HTML che riceva un FFFE esadecimale come primo byte di testo sa che quel carattere deve essere capovolto per tutta la rimanente parte 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 il paragrafo sulla bidirezionalità e codifica dei caratteri.

5.2.2 Specificare la codifica dei caratteri

Come fa un server a determinare quale codifica dei caratteri va applicata ad un dato documento? Alcuni server guardano ai primi byte del documento, o controllano in un database di file conosciuti e di codifiche. Molti server recenti danno al gestore del Web più controllo sulla configurazione dell'insieme dei caratteri rispetto ai vecchi server. I gestori del Web dovrebbero usare questi meccanismi per trasmettere un parametro "charset" quando sia possibile, ma dovranno stare attenti 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 deve fornire questa informazione. La maniera più semplice di informare l'interprete HTML sulla codifica dei caratteri del documento è usare il parametro "charset" del campo "Content-Type" dell'intestazione del protocollo HTTP ([RFC2068], paragrafi 3.4 e 14.18). Per esempio, l'intestazione HTTP seguente dichiara che la codifica dei caratteri è la EUC-JP:


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

Per la definizione di text/html si veda il paragrafo sulla conformità.

Il protocollo HTTP ([RFC2068], paragrafo 3.7.1) indica l'ISO-8859-1 come codifica di caratteri predefinita quando il parametro "charset" è assente dal campo "Content-Type" dell'intestazione. Di fatto, questa raccomandazione si è rivelata inutile perché alcuni server non consentono di mandare un parametro "charset", ed altri potrebbero non essere configurati per mandare quel parametro. Quindi gli interpreti HTML non devono assumere nessun valore predefinito per il parametro "charset".

Per ovviare alle limitazioni dei server o delle loro configurazioni, i documenti HTML possono includere informazioni esplicite sulla codifica dei caratteri; l'elemento META può essere usato per fornire questa informazione agli interpreti HTML.

Ad esempio, per specificare che la codifica dei caratteri del documento corrente è la "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 solo quando la codifica dei caratteri è organizzata in modo tale che i caratteri ASCII stanno da sé (almeno finché l'elemento META è riconosciuto). Le dichiarazioni META dovrebbero apparire il prima possibile nell'elemento HEAD.

Nei casi in cui né il protocollo HTTP né l'elemento META diano informazioni sulla codifica dei caratteri di un documento, l'HTML fornisce anche l'attributo charset su diversi elementi. Combinando questi meccanismi, un autore può aumentare parecchio le possibilità che quando l'utente raggiunge 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 (dalla priorità più alta alla più bassa):

  1. Un parametro HTTP "charset" in un campo "Content-Type".
  2. Una dichiarazione META con "http-equiv" posto a "Content-Type" ed un valore definito per "charset".
  3. L'attributo charset posto su un elemento che designa una risorsa esterna.

In aggiunta a questa lista di priorità, l'inteprete HTML può usare euristiche e impostazioni date dall'utente. Ad esempio, molti interpreti HTML usano una euristica per distinguere le varie codifiche usate nei testi in giapponese. Inoltre, gli interpreti HTML hanno tipicamente una codifica dei caratteri predefinita impostabile dall'utente da applicarsi in assenza di altre indicazioni.

Gli interpreti HTML possono fornire un meccanismo che permetta agli utenti di non usare informazioni "charset" non corrette. Tuttavia, se un inteprete HTML fornisce questo meccanismo deve solo offrirlo per la lettura (browsing), e non per la composizione (editing), per evitare la creazione di pagine Web marcate da un parametro "charset" non corretto.

Nota. Se, per un'applicazione specifica, si rende necessario riferire un carattere al di fuori dell'[ISO10646], i caratteri dovrebbero essere assegnati ad una zona privata per evitare conflitti con vesioni presenti o future dello standard. Questo è altamente scoraggiato, comunque, per ragioni di portabilità.

5.3 Riferimenti ai caratteri

Una data codifica dei caratteri può non essere capace di esprimere tutti i caratteri dell'insieme dei caratteri di un documento. Per queste codifiche, o quando le configurazioni hardware e software non permettano agli utenti di immettere qualche carattere direttamente, gli autori possono usare i riferimenti ai caratteri di SGML. I riferimenti ai caratteri sono meccanismi indipendenti dalla codifica per immettere qualunque carattere dall'insieme dei caratteri di un documento.

In HTML, i riferimenti ai caratteri possono apparire in due forme:

I riferimenti ai caratteri nei commenti non hanno significato speciale; sono solo dati di commento.

Nota. L'HTML fornisce altri modi di presentare caratteri, in particolare le immagini in linea.

Nota. In SGML, in alcuni casi è possibile eliminare il ";" finale dopo un riferimento a carattere (ad es. a fine riga, o immediatamente prima di un tag). In altri casi essi non possono essere eliminati (ad es. nel mezzo di una parola). Si raccomanda di usare sempre il ";" per evitare problemi con quegli interpreti HTML che vogliono che questo carattere sia presente.

5.3.1 Riferimenti numerici ai caratteri

I riferimenti numerici ai caratteri specificano il codice di posizione di un carattere nell'insieme dei caratteri. I riferimenti numerici ai caratteri possono avere due forme:

Ecco alcuni esempi di riferimenti numerici ai caratteri:

Nota. Sebbene la rappresentazione esadecimale non sia definita nell'[ISO8879], ci si aspetta che lo sarà nella revisione, come descritto in [WEBSGML]. Questa convenzione è particolarmente utile poiché gli standard dei caratteri usano generalmente la rappresentazione esadecimale.

5.3.2 Riferimenti ad entità di caratteri

Per dare agli autori un modo più intuitivo di riferire i caratteri dell'insieme dei caratteri, l'HTML offre un insieme di riferimenti ad entità di carattere. I riferimenti ad entità di carattere usano dei nomi simbolici così che l'autore non deve ricordare i codici di posizione. Ad esempio, il riferimento all'entità di carattere &aring; si riferisce al carattere "a" con un anello sopra; "&aring;" è più facile di &#229; da ricordare.

L'HTML 4.0 non definisce un riferimento ad entità di carattere per ogni carattere dell'insieme dei caratteri. Per esempio, non c'è un riferimento ad entità di carattere per la lettera cirillica maiuscola "I". Si veda la lista completa dei riferimenti ai caratteri definiti in HTML 4.0.

I riferimenti ad entità di carattere sono maiuscolo significative. Quindi &Aring; fa riferimento ad un carattere (la A maiuscola con anello) diverso da quello riferito da &aring; (a minuscola con anello).

Quattro riferimenti ad entità di carattere meritano una menzione speciale, poiché sono usati spesso per caratteri speciali:

Gli autori che vogliano mettere nel testo il carattere "<" dovranno usare "&lt;" (ASCII decimale 60) per evitare possibile confusione con l'inizio di un tag (delimitatore aperto di tag iniziale). Analogamente, gli autori dovranno usare "&gt;" (ASCII decimale 62) nel testo, anziché ">" per evitare problemi con vecchi interpreti HTML che interpreterebbero erroneamente questo carattere come la fine di un tag (delimitatore di chiusura di tag) quando appare tra virgolette.

Gli autori dovranno usare "&amp;" (ASCII decimale 38) invece di "&" per evitare confusione con l'inizio di un riferimento a carattere (delimitatore aperto riferimento ad entità). Gli autori dovranno anche usare "&amp;" nei valori degli attributi perché i riferimenti ai caratteri sono permessi nei valori di attributi CDATA.

Alcuni autori usano il riferimento ad entità di carattere "&quot;" per codificare istanze della marca di doppie virgolette (") poiché quel carattere può essere usato per delimitare il valore degli attributi.

5.4 Caratteri non visualizzabili

Un interprete HTML può non essere capace di visualizzare significativamente tutti i caratteri di un documento, ad esempio, perché l'interprete HTML manca di un font opportuno, o un carattere ha un valore che non può essere espresso nella codifica dei caratteri interna dell'interprete HTML, ecc.

Poiché molte sono le cose che possono farsi in questi casi, questo documento non prescrive nessun comportamente specifico. A seconda dell'implementazione, i caratteri non visuallizzabili possono essere trattati dal sistema di visualizzazione sottostante e non dall'applicazione direttamente. In assenza di un comportamento più sofisticato, fatto su misura, ad esempio, per le necessità di un dato script o linguaggio, si fanno le seguenti raccomandazioni per interpreti HTML:

  1. Adottare un meccanismo chiaramente visibile, ma non fastidioso, per indicare all'utente delle risorse mancanti.
  2. Se i caratteri mancanti sono presentati usando la loro rappresentazione numerica, usare la forma esadecimale (non la decimale), poiché questa è la forma usata dagli standard sugli insieme dei caratteri.