Introduzione.
Le codifiche ISO-8859.
Gestione delle codifiche.
Il mondo di Unicode.
Conclusioni.
Links.
Introduzione.
A tutti (o quasi) quelli che usano le news (che in termini tecnici si dice "utilizzatori di Usenet") sarà capitato di sentirsi dire: per favore, non usare i caratteri accentati, limitati al ASCII; e altre volte gli sarà capitato di vedere messaggi dove al posto delle suddette lettere accentate, simboli eccetera si trovano sghiribizzi strani o, nella migliore delle ipotesi, quadratini.
In questa pagina voglio provare a spiegare cosa succede in termini semplici che non richiedano conoscenze di informatica.
I calcolatori, siano un vecchissimo C64 o un nuovissimo P4, capiscono solo una cosa: numeri. L'unica cosa che fanno è spostare numeri da una parte all'altra di una memoria e fare calcoli con questi numeri. Stop. Il resto è solo software, ovvero combinare somme, sottrazioni e spostamenti di numeri per fare tutto quello che siamo abituati a vedere.
Il problema che affrontiamo qui è:come facciamo a utilizzare lettere? Noi vogliamo spostare da un punto all'altro (di Internet, diciamo) non numeri, ma lettere (come per esempio questo messaggio). La soluzione è semplice: ci mettiamo d'accordo su una equivalenza fra lettere e numeri. Per esempio, diciamo che il numero 65 è corrisponde alla lettere "A" ("a maiuscola"), che il numero 49 alla lettera "1" (rappresentazione del numero 1), eccetera. Inventiamo una tabellina che unisce ogni lettera con un numero: questa tabellina è quello che si chiama codifica, o meglio codifica di caratteri o, in gergo, charset. Il nostro fido PC, quando vede il numero 65 e sa che deve disegnare un carattere, si limita a andare a vedere nel "font" che sta usando, sceglie il carattere corrispondente al numero 65, e lo copia nello schermo (o finestra, o stampante...). Geniale, no? Nota che il PC non ha la più pallida idea che quello che ha scritto sia una A o una runa celtica... lui solo sposta cose di qui e di lá.
All'inizio del boom del PC personale, praticamente ogni costruttore si inventava la sua tabellina. Mai provato a passare un file da un commodore 64 a un ZX80? No? Fortunelli... Comunque, dopo un periodo di caos, uno standard è venuto fuori: lo standard ASCII, che è una tabellina che associa un numero a tutti i caratteri, maiuscoli e minuscoli, utilizzati dalla lingua inglese, ai 10 numeri e ad una serie di simboli utili come parentesi, eccetera. In tutto, un centinaio di simboli.
E qui avvenne il fattaccio. La memoria di un calcolatore è formata da tanti "byte", che sono scatoline in grado di ricordare ognuna un numero compreso fra 0 e 255: un totale di 256 valori diversi. Si è deciso quindi che ad ogni byte corrispondesse un carattere, tanto ci stava largo...
A questo punto, praticamente tutti i programmi che lavorano con caratteri (ovvero quasi tutti) sono stati scritti considerando la corrispondenza 1 byte uguale a 1 carattere. Poi, gli europei hanno cominciato a (giustamente) protestare: i caratteri degli anglofoni non ci bastano, noi usiamo altri caratteri, come le accentate, la "eñe", gli umlaut... e se è vero che si pùo scrivere "ò" come "o`", ü come "ue", (operazione che si chiama "translitterazione"), è brutto e a volte impossibile (non esiste una transliterazione accettata di ñ, per esempio).
A questo punto, ognuno ha iniziato a fare cas... ehem, confusione. Ogni casa di software si è inventata un'estensione all'ASCII, utilizzando il centinaio di "posti vuoti" nel byte. Alcune case adirittura utilizzavano varie estensioni per prodotti diversi (per esempio, la codifica "west europe" di MSDOS -cp850- non è la stessa di quella di MS-Windows -win1252-, credo). Per fortuna, la ISO ha alla fine deciso di prendere la cosa in mano ed è stato inventato uno standard, che si chiama ISO-8859.
La ISO ha generato una serie di tabelline, una per ogni lingua (o gruppo di lingue), ognuna con la sua bella estensione di simboli. Per esempio, il charset iso-8859-1 serve per le lingue dell'Europa occidentale; il iso-8859-2 per le lingue slave, eccetera. Ultimamente, iso-8859-15 ha sostituito -1 per aggiungere il simbolo dell'euro e qualche altra cosetta. Per complicare un pò le cose, ogni charset ha un nomignolo: per esempio, iso-8859-1 è anche conosciuto come "latin1" e iso-8859-2 come "latin2"; però iso-8859-7 ha come nomignolo "greek" e iso-8859-15 "latin9".
Perché tante codifiche e non una sola? Semplice, perché nel mondo ci sono troppi simboli, lettere, caratteri: in un byte non ci stanno. Punto. E non è tutto qui: ci sono alcune lingue che con 256 caratteri non possono nemmeno iniziare a scrivere, pensate per esempio al Cinese... ma di questo parlerò dopo.
Tutti i charset ISO-8859 hanno una bella caratteristica: sono "superset" del caro, vecchio ASCII. Ovvero, i numeri che corrispondono ai caratteri degli originari ASCII corrispondo, in qualsiasi codifica iso-8859, agli stessi caratteri. La A maiuscola è sempre 65. Le codifiche cambiano solo per i caratteri "strani", quelli accentati, i simboli monetari, eccetera.
Questo fatto, unito al fatto che continuiamo ad avere 1 byte per ogni carattere, fa sí che non è necessario cambiare i programmi: tutto funziona come prima, e il fatto che i "caratteri ASCII estesi" (frase da non utilizzare, perché non significa nulla) vengano visualizzati bene o no è, alla fine, solo una questione di convenzioni.
Ora abbiamo un piccolo problema: se riceviamo un messaggio, questo messaggio è fatto di numeri. Questi numeri rappresentano dei caratteri, ok; ma quali? Con che tipo di codifica li deve interpretare il programma che ci mostra il messaggio?
Ogni messaggio ha, normalmente, un header: una serie di informazioni (quando e da chi è stato inviato, e cose del genere); una delle informazioni è (o almeno dovrebbe essere) il tipo di charset utilizzare. Per esempio, un email o un messaggio di news avrá fra gli header:
Content-Type: text/plain; charset=ISO-8859-1e una pagina HTML, nella zona definita da<head>
e</head>
:<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">Questo dice al nostro programma che l'autore ha scritto il testo in "latin1", e quindi sa in che posto cercare il carattere corrisponente ad ogni numerino del messaggio.I problemi nascono dal fatto che molti software ignorano il problema. Il 90% dei programmi per leggere posta e news fanno finta che il charset sia sempre "latin1" e quindi vengono fuori caratteri strani. Peggio, alcuni sofware dicono (negli header) di usare "latin1" e poi non lo fanno: mai visto le virgolette e gli accenti trasformarsi in quadratini? no? Sei sempre più fortunato...
Inoltre, c'è un'altro problema. Supponiamo che io scrivo un messaggio usando "latin1", tipo questo:
(nota la e accentata dopo "uva"). Poi qualcuno che usa "win1252" vuole rispondere. Che deve fare il suo software? Prendere il mio messaggio, convertire la "è" nella nueva codifica, e poi "quotarlo" correttametnte. Ma molti software ignorano totalmente il problema:
il programma di chi ha risposto non ha "ri-codificato" la e accentata, e il mio newsreader ha trovato un carattere che non dovrebbe esserci: per quello ci mette il quadratino, che è come dire: boh?. Notate anche che i caratteri ASCII normali sono stati riportati fedelmente, grazie al fatto che sono gli stessi in tutte le codifiche.
Questa è la ragione per cui a volte la gente vi chiede di scrivere "senza accenti": in questo modo anche chi ha un software vecchio o uno nuovo e bacato può leggere agevolmente il vostro messaggio, sempre. E in fondo i messaggi su Usenet non devono essere graficamente "belli": quello che conta è il contenuto.
E se io volessi usare insieme caratteri di set diversi? O scrivere qualcosa in Cinese? In questo caso, il problema diventa grosso. Ma una soluzione c'è: lo standard Unicode.
Lo standard Unicode prevede che si utilizzino più byte per rapressenare un carattere: per l'esattezza, 4 byte: questo dà la possibilità di definire una tabella di più di 4 miliardi di caratteri. Il problema con questa tabella è che tutti i documenti aumenterebbero di 4 volte la loro dimensione, anche se non fossero utilizzati i caratteri "strani"...
Per risolvere il problema, c'è un modo di codificare (riassumere) i caratteri Unicode (si, è la codifica di una codifica) con un codice strano: UTF-8. Questa codifica prevede che tutti i codici numerici che corrispondono all'ASCII rimangono uguali: ovvero, se il numerino che sta nel byte è un codice valido di una carattere ASCII, fatta finita. Sennò, si utilizza il metodo del prefisso: per esempio, il simbolino di copyright "©" (che in latin1 è il numero 169) in utf-8 si scriverebbe con due byte: il primo, 194, dice che non 'e finita qui: il prossimo è un simbolo speciale. Il secondo numerino, 169, indica il simbolo corretto.
Il problema sta nel fatto che con utf-8 non c'è più la corrispondenza 1 carattere - 1 byte; non si può più semplicemente contare quanti byte occupa una frase per dire quanto è lunga. Questo fa sí che i programmi che non considerano esplicitamente utf-8 non funzionano. Non è come con le codifiche iso-8859, dove potreste avere qualche carattere sbagliato. Nella migliore delle ipotesi, il vostro programma sputerà fuori coppie (o triplette, o anche più) caratteri dove dovrebbe essercene uno solo. Per esempio, il carattere "©", trasmesso in utf-8, e ricevuto da un programma che non conosce utf-8 ma solo iso-8859-1, verrebbe rappresentato da i due caratteri: "©".
Se tutti i software funzionassero bene, e tutti quanti sapessero dell'esistenza delle varie codifiche, il bello sarebbe poter scrivere come più ci piace e dimenticarci di tutto. Probabilmente, in utf-8 e poter infilare nel nostro testo anche i caratteri Thai, se ne avessimo voglia. Però, purtroppo, per ora pochi programmi sono tanto "bravi"...
Se viceversa vogliamo che i nostri messaggi siano letti facilmente dal massimo numero di persone possibile, allora la ricetta è semplice: ci si limita ai caratteri ASCII, ovvero, niente accenti. E se si vogliono usare gli accenti, si cerca di utilizzare iso-8859-1 (o iso-8859-15), che è uno standard, e non i vari charset Mac, Win, Bip, Lip o Dip (
:-)
) che si sono in giro.Nota importante: tutto questo vale se sul vostro PC ci sono i "font" per disegnare i caratteri Unicode: sennó, altri quadratini in vista...
Nota ancora: è possibile scrivere le pagine in HTML in modo totalmente indipendente dal charset. Provate a fare "view source" su questa pagina...
Un sacco di cose per approfondire il tema, tavole di caratteri, e molte altre cose le trovate nel sito di Roman Czyborra.
Tavole di riferimento (utilissime per scrivere HTML) le trovate nel sito di BBS. (non so chi siano, l'ho trovato con Google).
La pagina su Unicode e UTF-8 di Markus Khun dice di essere una FAQ di Unicode per Unix, ma mente: è una fonte di informazione per Unicode e UTF-8 in generale ricca, completa e facile da capire.