Sommario
In questo capitolo si esamina il modo in cui i documenti HTML sono rappresentati su un computer o attraverso Internet.
La sezione sull'insieme di caratteri di un documento affronta il problema di quali caratteri possono in teoria 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 sulla codifica dei caratteri tratta il problema di come questi caratteri possono essere rappresentati all'interno di un file o quando sono trasferiti attraverso Internet. Dal momento che alcune codifiche di caratteri non possono rappresentare direttamente tutti i caratteri che un autore potrebbe voler includere in un documento, l'HTML offre altri meccanismi, chiamati riferimenti a caratteri, per richiamare un qualsiasi carattere.
Poiché esiste un gran numero di caratteri al'interno delle lingue usate dagli uomini, ed una gran varietà di modi per rappresentare quei caratteri, deve essere posta una particolare attenzione affinché i documenti possano essere compresi dai programmi utente in ogni parte del mondo.
Per promuovere l'interoperabilità, lo SGML impone che ogni applicazione (incluso l'HTML) specifichi il suo insieme di caratteri del documento. Un insieme di caratteri del documento si compone di:
Ogni documento SGML (con l'inclusione di ogni documento HTML) è una sequenza di caratteri tratti dal repertorio. I sistemi informatici identificano ogni carattere per mezzo della 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 di caratteri ASCII non è sufficiente per un sistema informativo globale quale è il Web, pertanto l'HTML utilizza il molto più completo insieme di caratteri denominato Universal Character Set (UCS), definito in [ISO10646]. Questo standard definisce un repertorio di migliaia di caratteri utilizzati dalle comunità di tutto il mondo.
L'insieme di caratteri definito in [ISO10646] è equivalente carattere per carattere ad Unicode ([UNICODE]). Entrambi questi standard vengono aggiornati periodicamente con l'inserimento di nuovi caratteri, e gli emendamenti dovrebbero essere consultati presso i rispettivi siti Internet. Nelle presenti specifiche, "[ISO10646]" è usato in riferimento all'insieme di caratteri del documento, mentre "[UNICODE]" è riservato per i riferimenti all'algoritmo di testo bidirezionale Unicode.
L'insieme dei caratteri del documento, tuttavia, non è sufficiente a permettere ai programmi utente di interpretare correttamente i documenti HTML nel modo in cui essi sono normalmente scambiati -- cioè codificati come una sequenza di byte in un file o nel corso di una trasmissione via rete. I programmi utente devono conoscere anche la particolare codifica dei caratteri che è stata usata per trasformare il flusso di caratteri nel documento in un flusso di byte.
Ciò che queste specifiche chiamano codifica dei caratteri è noto in altre specifiche con nomi differenti (il che può generare qualche confusione). Tuttavia il concetto è fondamentalmente lo stesso in qualunque ambito di Internet. Inoltre, intestazioni di protocollo, attributi e parametri che fanno riferimento alla codifica dei caratteri condividono il medesimo nome -- "charset" -- ed usano gli stessi valori tratti dal registro [IANA] (si veda [CHARSETS] per un elenco completo).
Il parametro "charset" identifica una codifica dei caratteri, che consiste in un metodo per convertire una sequenza di byte in una sequenza di caratteri. Questa conversione si adatta naturalmente allo schema di funzionamento del Web: i server mandano documenti HTML ai programmi utente sotto forma di un flusso di byte; i programmi utente li interpretano come una sequenza di caratteri. Il metodo di conversione può spaziare dalla semplice corrispondenza uno-a-uno a complessi schemi di commutazione o algoritmi.
Una semplice tecnica di codifica un-byte-per-carattere non è sufficiente per stringhe di testo basate su un repertorio di caratteri vasto come [ISO10646]. Esiste una serie di codifiche differenti di porzioni di [ISO10646] in aggiunta alla codifica dell'intero insieme di caratteri (quale UCS-4).
Gli strumenti autoriali (es., gli editori di testo) possono codificare i documenti HTML scegliendo il tipo di codifica del carattere, e la scelta dipende in larga misura dalle convenzioni usate dai programmi di sistema. Questi strumenti possono impiegare qualsiasi codifica idonea a coprire la maggior parte dei caratteri contenuti nel documento, purché la codifica sia correttamente etichettata. Caratteri occasionali che cadono al di fuori di questa codifica possono ancora essere rappresentati per mezzo di riferimenti a caratteri. Questi rimandano sempre all'insieme dei caratteri del documento, non alla codifica dei caratteri.
Server e proxy possono cambiare al volo una codifica di caratteri (il che è chiamato transcodifica) per soddisfare le richieste dei programmi utente (si veda la sezione 14.2 di [RFC2616], l'intestazione HTTP di richiesta "Accept-Charset"). Server e proxy non hanno l'obbligo di fornire un documento in una codifica dei caratteri che copra l'intero insieme di caratteri del documento.
Le codifiche dei caratteri comunemente usate sul Web includono ISO-8859-1 (conosciuta anche come "Latin-1"; utilizzabile per la maggior parte delle lingue occidentali), ISO-8859-5 (che supporta il cirillico), SHIFT_JIS (una codifica del giapponese), EUC-JP (un'altra codifica del giapponese) e UTF-8 (una codifica di ISO 10646, che adopera un differente numero di byte per caratteri differenti). I nomi delle codifiche dei caratteri sono maiuscolo-indifferenti, perciò, ad esempio, "SHIFT_JIS", "Shift_JIS" e "shift_jis" sono equivalenti.
Queste specifiche non impongono quali codifiche dei caratteri i programmi utente debbano supportare.
I programmi utente conformi devono rappresentare correttamente in ISO 10646 tutti i caratteri in una qualsiasi codifica dei caratteri da essi riconosciuta (oppure devono comportarsi come se lo avessero fatto).
Quando il testo HTML è trasmesso in UTF-16 (charset=UTF-16), i dati di testo dovrebbero essere trasmessi secondo l'ordine di byte della rete ("big-endian", il byte più significativo per primo) in conformità con [ISO10646], sezione 6.3 e [UNICODE], paragrafo C3, pagina 3-1.
Inoltre, per massimizzare le possibilità di corretta interpretazione, si raccomanda che i documenti trasmessi come UTF-16 comincino sempre con un carattere ZERO-WIDTH NON-BREAKING SPACE (FEFF in esadecimale, chiamato anche Byte Order Mark (BOM)), che, una volta rovesciato l'ordine dei byte, diviene l'esadecimale FFFE, un carattere che è garantito non essere mai stato assegnato. Così, un programma utente che riceve un FFFE esadecimale nei byte iniziali del testo dovrebbe sapere che i byte devono essere invertiti per tutto il testo rimanente.
Il formato di trasformazione UTF-1 di [ISO10646] (registrato da IANA come ISO-10646-UTF-1), non dovrebbe essere adoperato. Per informazioni circa ISO 8859-8 e l'algoritmo bidirezionale, si consulti la sezione su bidirezionalità e codifica dei caratteri.
Come fa un server a determinare quale codifica dei caratteri si applica a un documento da servire? Alcuni server esaminano i primi byte del documento o interrogano un database di file e codifiche noti. Molti dei moderni server danno ai gestori di siti maggiore controllo sulla configurazione delle codifiche di carattere rispetto a quanto fanno i vecchi server. I gestori dei siti dovrebbero usare questi meccanismi per inviare un parametro "charset" non appena possibile, ma dovrebbero stare attenti a non identificare un documento con un valore errato del parametro "charset".
Come fa un programma utente a sapere quale codifica dei caratteri è stata usata? È il server che dovrebbe fornire questa informazione. Il modo di gran lunga più diretto per un server di informare il programma utente circa la codifica dei caratteri di un documento è di usare il parametro "charset" del campo di intestazione "Content-Type" del protocollo HTTP ([RFC2616], sezioni 3.4 e 14.17). 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 ([RFC2616], sezione 3.7.1) cita ISO-8859-1 come codifica dei caratteri predefinita quando il parametro "charset" è assente dal campo di intestazione "Content-Type". All'atto pratico questa raccomandazione si è dimostrata inutilizzabile perché alcuni server non consentono che sia inviato un parametro "charset", mentre altri possono non essere configurati per inviare quel parametro. Perciò i programmi utente non devono assumere alcun valore predefinito per il parametro "charset".
Per far fronte alle limitazioni dei server o delle configurazioni, i documenti HTML possono includere informazioni esplicite sulla codifica dei caratteri del documento; l'elemento META può essere usato per fornire ai programmi utente tali 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 soltanto quando la codifica dei caratteri è organizzata in modo tale che i byte valorizzati come ASCII rappresentino caratteri ASCII (almeno finché l'elemento META non sia stato analizzato). Le dichiarazioni META dovrebbero comparire prima possibile all'interno dell'elemento HEAD.
Nei casi in cui né il protocollo HTTP né l'elemento META forniscono informazioni circa la codifica dei caratteri di un documento, l'HTML fornisce ancora l'attributo charset per vari elementi. Grazie all'uso combinato di questi meccanismi, un autore può aumentare notevolmente le possibilità che, quando l'utente recupera una risorsa, il programma utente riconosca la codifica dei caratteri.
Per riassumere, i programmi utente conformi devono osservare le seguenti priorità quando tentano di determinare la codifica dei caratteri di un documento (dalla più alta alla più bassa):
In aggiunta a questa lista di priorità, il programma utente può usare calcoli euristici e impostazioni utente. Molti programmi utente usano, ad esempio, calcoli euristici per distinguere tra i vari tipi di codifica adoperati per il testo in giapponese. I programmi utente dispongono normalmente anche di una codifica dei caratteri locale predefinita, impostabile dall'utente, che applicano in assenza di altri indicatori.
I programmi utente possono disporre di un sistema che consente agli utenti di annullare informazioni di tipo "charset" non corrette. Tuttavia, se un programma utente offre un simile meccanismo, dovrebbe renderlo disponibile solo per la navigazione e non per la modifica, per evitare la creazione di pagine Web identificate da un parametro "charset" non corretto.
Nota. Se, per una specifica applicazione, diviene necessario richiamare caratteri non compresi in [ISO10646], quei caratteri dovrebbero essere assegnati ad una zona privata per evitare conflitti con la presente o con future versioni dello standard. Tuttavia ciò è fortemente disincentivato per ragioni di portabilità.
Un dato tipo di codifica può non essere in grado di rappresentare tutti i caratteri dell'insieme di caratteri del documento. Se si stanno usando simili codifiche, o quando particolari configurazioni hardware o software non consentono agli utenti di immettere direttamente alcuni caratteri del documento, gli autori possono usare i riferimenti a caratteri di SGML. I riferimenti a caratteri sono un meccanismo indipendente dalla codifica dei caratteri per inserire un qualsiasi carattere appartenente all'insieme dei caratteri del documento.
I riferimenti a caratteri in HTML possono apparire in due forme:
I riferimenti a caratteri all'interno di commenti non hanno alcun significato speciale; essi sono semplici dati di commento.
Nota. L'HTML fornisce altri modi di presentare dati di tipo carattere, in particolare con le immagini in riga.
Nota. In SGML è possibile in alcuni casi eliminare il ";" finale dopo un riferimento a caratteri (ad es., in corrispondenza di un'interruzione di riga o immediatamente prima di un marcatore). In altre circostanze esso non può essere eliminato (ad es., nel mezzo di una parola). Consigliamo caldamente di utilizzare il ";" in tutti i casi, per evitare problemi con quei programmi utente che richiedono la presenza di questo carattere.
I riferimenti numerici a caratteri specificano la posizione di codifica di un carattere nell'insieme dei caratteri del documento. I riferimenti numerici a caratteri possono assumere due forme:
Ecco alcuni esempi di riferimenti numerici a caratteri:
Nota. Benché la rappresentazione esadecimale non sia definita in [ISO8879], ci si aspetta che sarà inserita nella revisione, come descritto in [WEBSGML]. Questa convenzione è particolarmente utile, dal momento che gli standard relativi ai caratteri usano generalmente la rappresentazione esadecimale.
Allo scopo di dare agli autori uno strumento più intuitivo per richiamare caratteri appartenenti all'insieme di caratteri del documento, l'HTML offre un insieme di riferimenti ad entità carattere. I riferimenti ad entità carattere usano nomi simbolici in modo che gli autori non debbano ricordare posizioni di codifica. Per esempio, il riferimento di entità a caratteri å referenzia la lettera minuscola "a" sormontata da un anello; "å" è più facile da ricordare di å.
L'HTML 4 non definisce un riferimento ad entità carattere per ogni elemento dell'insieme di caratteri del documento. Ad esempio, non c'è un riferimento ad entità carattere per la lettera cirillica maiuscola "I". Si consulti in proposito l'elenco completo dei riferimenti a caratteri definito nell'HTML 4.
I riferimenti ad entità carattere sono sensibili alla maiuscola. Pertanto, Å rimanda ad un carattere differente (A maiuscola, con anello) rispetto a å (a minuscola, con anello).
Quattro riferimenti ad entità carattere meritano una menzione particolare, dal momento che sono adoperati frequentemente per evitare caratteri speciali:
Gli autori che desiderano inserire il carattere "<" nel testo dovrebbero usare "<" (decimale ASCII 60) per evitare la possibile confusione con la parte iniziale di un marcatore (il delimitatore di apertura del marcatore iniziale). Allo stesso modo, gli autori dovrebbero usare ">" (decimale ASCII 62) all'interno del testo in luogo di ">", per evitare problemi con i programmi utente più vecchi, che percepiscono questo segno in modo non corretto, come se fosse la parte finale di un marcatore (il delimitatore di chiusura di un marcatore), quando esso appare in valori di attributo racchiusi tra apici.
Gli autori dovrebbero usare "&" (decimale ASCII 38) invece di "&", per evitare confusioni con la parte iniziale di un riferimento a caratteri (il delimitatore di apertura di riferimenti ad entità). Gli autori dovrebbero inoltre usare "&" nei valori di attributo dal momento che i riferimenti a caratteri sono permessi all'interno dei valori di attributo CDATA.
Alcuni autori usano il riferimento ad entità carattere """ per codificare istanze del segno di interpunzione doppi apici ("), poiché quel carattere può essere utilizzato per delimitare i valori di attributo.
Un programma utente può non essere in grado di riprodurre in maniera significativa tutti i caratteri in un documento, per esempio perché il programma utente non dispone del tipo di caratteri idoneo, o perché un carattere ha un valore che può non essere espresso secondo il tipo di codifica dei caratteri usato internamente dal programma utente, ecc.
Poiché vi sono molte cose differenti che possono essere fatte in simili circostanze, questo documento non prescrive alcun comportamento particolare. A seconda dei casi, i caratteri non visualizzabili possono essere presi in consegna anche dal sottostante sistema di visualizzazione e non dall'applicazione stessa. Nell'assenza di un comportamento più sofisticato, adattato ad esempio ai bisogni di un particolare script o linguaggio, si raccomanda che i programmi utente osservino il seguente comportamento: