Percorso: "Rappresentazione e analisi del testo e dei documenti" UNITA' 1 - Rappresentazione del testo: Caratteri, alfabeti e codifica, fino a Unicode SINTESI Il web moderno è multilingue e multiculturale. Tutto è nato quando si è pensato di collegare un computer a una telescrivente. [3] Ma i computer di 40-50 anni fa parlavano solo Inglese. I computer di 20 anni fa rappresentavano le lingue con codifiche settoriali e incompatibili. Da ASCII a Unicode. Unicode è democratico: tutte le lingue sono trattate (quasi) allo stesso livello. Unicode è essenziale per le comunicazioni globali e la condivisione della cultura. Unicode è ormai lo standard riconosciuto: indispensabile per gli strumenti di trattamento dei testi. 1. Caratteri e alfabeti I caratteri sono gli elementi atomici del testo scritto. Un alfabeto è un repertorio di caratteri. In generale lingue diverse usano diversi alfabeti .. .. anche se lo stesso alfabeto può essere condiviso da più lingue; per esempio, Arabo e Persiano, e, più raramente, la stessa lingua può far uso di alfabeti alternativi; per esempio, il "Serbo-Croato". 2. Memorizzazione e interscambio dei testi Per millenni i testi scritti sono stati rappresentati su supporti fisici come pietra, terracotta, pelli e carta. Lo stesso supporto serviva sia per visualizzare che per memorizzare un testo. I testi venivano scambiati insieme con il loro supporto originale. Fare la copia di un testo implicava l'utilizzo di un nuovo elemento di supporto. Per non andare troppo indietro, saltiamo l'alfabeto Morse, i codici militari, e anche la telescrivente (fine '800). Il problema dell'interscambio è diventato cruciale quando si è pensato di collegare computer e telescriventi. Precedentemente, i computer erano usati quasi solo per "macinare" numeri: era stato affrontato solo il problema di come rappresentare i numeri. Nel 1969 negli USA il DARPA varò ARPANET, precursore di Internet; inizialmente collegava 4 computer di diversi produttori. Ma ogni computer rappresentava i caratteri in modo diverso. 3. La codifica dei caratteri: ASCII ed estensioni I linguaggi artificiali usati dai computer negli anni 50-60 usavano solo cifre, lettere inglesi maiuscole e segni di interpunzione. ARPANET doveva servire anche, e soprattutto, per scambiare documenti; si pensi anche che la posta elettronica fu uno degli usi più significativi di ARPANET e poi di Internet. Per far parlare tra loro i computer di ARPANET, si usò la codifica ASCII (American Standard Code for Information Interchange), del 1968. ASCII era (è) uno standard tecnico per la codifica dei caratteri in forma digitale (mediante cifre binarie 0 e 1). ASCII serviva a rappresentare 127 diversi caratteri: 95 caratteri stampabili e 32 caratteri "speciali": - i caratteri stampabili comprendevano le lettere dell'alfabeto Inglese, segni di interpunzione, cifre e operatori matematici - i caratteri non stampabili includevano quelli già usati per il controllo delle telescriventi. Per codificare 127 caratteri servono 7 bit (2 exp 7 = 128). Il byte, che allora si stava affermando come unità di memoria, è composto di 8 bit. Che uso fare dell'ottavo bit? 4. Le estensioni della codifica ASCII In molti casi l'ottavo bit venne usato per raddoppiare il numero di caratteri (2 exp 8 = 256) rappresentabili, dando luogo a estensioni dell'ASCII. Si parla di "estensioni" perché ogni variante era "compatibile" con ASCII, cioè usava i codici fino a 127 ("prima pagina") con lo stesso significato; per esempio - un'estensione diffusa fu l'ISO 8859-1, detto anche "Latin1", che aggiungeva una "seconda pagina" di lettere minuscole accentate o modificate, usate dalle lingue dell'Europa occidentale (da Spagnolo e Francese alle scandinave) - altre estensioni erano l'ISO 8859-2 per i linguaggi dell'Europa Orientale e l'ISO 8859-5 per i caratteri cirillici. A questo punto già si capisce che - se volete comunicare, chi scrive e chi legge devono usare la stessa "chiave" di codifica dei caratteri [3] - se non volete limitarvi al testo Inglese in senso stretto, gli altri potranno leggere i contenuti da voi creati .. solo se gli passate la "chiave", cioè il codice da voi usato [1] (a meno che non siate tutti degli Sherlock Holmes). 5. Finalmente Unicode (in astratto) Il percorso per arrivare da ASCII a Unicode non è stato semplice né lineare; l'obbiettivo era di definire una codifica universale, cioè un unico codice in grado di "ospitare" tutti i possibili alfabeti. Ma quanti sono gli alfabeti nel mondo? Qualcuno parla di 7000 lingue [4]; difficile contare gli alfabeti. E quanti diversi caratteri sono necessari per supportare tutte queste lingue? Attualmente si è arrivati a identificarne oltre 165000. All'inizio ci sono stati tentativi di rappresentare TUTTI i caratteri non con 1, ma con 2 o più byte CIASCUNO. Problemi principali: - la compatibilità: un'enorme quantità di testi, inclusi praticamente tutti i programmi per computer, sono ancora in ASCII - spreco di memoria: rappresentare ogni carattere con 2 byte porta a raddoppiare la memoria centrale, la memoria di disco, ecc. - ma poi 2 byte bastano? No, già si dovrebbe passare a 3 o 4 byte (2 exp 6 = 64 K = circa 64000). Unicode è un sistema di codifica aperto, inclusivo: pronto ad ospitare tutti i caratteri di tutte le lingue del mondo. Unicode è definito a due livelli; ad un LIVELLO ASTRATTO ogni carattere è semplicemente un numero, detto anche "code point". Non è specificato un valore massimo per i code point. Un carattere Unicode è identificato da un simbolo del tipo U+0020, cioè da un prefissi "U+" seguito dalla rappresentazione esadecimale del codepoint. U+0020 identifica il carattere spazio, il cui codepoint è 32 in decimale, 20 in esadecimale. 6. Unicode in pratica A LIVELLO CONCRETO un carattere Unicode è rappresentato in memoria (e nella comunicazione tra dispositivi) con il numero di byte richiesto dal code point (il numero che lo identifica in astratto) e dallo "encoding" fisico prescelto. La modalità di "encoding" che si è affermata negli ultimi anni è chiamata "UTF-8": per non generare confusione, non citiamo le altre. Tuttavia i text processor come "Blocco Note" di Microsoft o come "Notepad ++", e le applicazioni di Microsoft-Office o OpenOffice, potrebbero chiedervi di indicare quale è la codifica (eventualmente diversa da UTF-8) del documento da aprire: per documenti "legacy" potreste dover fare alcuni tentativi prima di trovare quella giusta; altrimenti il contenuto dello schermo potrebbe essere illegibile. In Unicode, non casualmente, i primi 127 code point corrispondono ai 127 caratteri ASCII. Nella codifica UTF-8, l'ottavo bit di un byte è usato per indicare (se uguale a 1) che la rappresentazione del carattere continua nel byte successivo. Questo consente di avere caratteri codificati con 1, 2 o più byte, ciascuno in modo indipendente dagli altri. Certo, si tratta di un meccanismo complesso, di cui però l'utente comune non deve preoccuparsi, e che risolve molti problemi - compatibilità con ASCII: un testo ASCII è automaticamente anche un valido testo Unicode in codifica UTF-8 - compattezza: ogni carattere consuma il minimo numero di byte necessari. Anche un programmatore non deve conoscere i dettagli della codifica UTF-8. Ma: deve ricordarsi che un testo non è condivisible se non ne è nota la codifica; deve usare sempre la codifica UTF-8 quando crea nuovi contenuti, soprattutto se questi sono destinati al Web. 7. Unicode è democratico e multiculturale Unicode è ormai lo standard riconosciuto: indispensabile per tutti gli strumenti per il trattamento dei testi. Il web attuale non sarebbe concepibile senza l'esistenza di Unicode. Fino a qualche anno fa era normale trovare pagine web visualizzate con un po' di "immondizia" o del tutto illegibili: era necessario usare una funzione del browser per impostare, a tentativi, la codifica originaria della pagina, cioè la "chiave" di lettura. Con Unicode tutte le lingue del mondo sono sullo stesso piano; o quasi; per esempio, un testo in una lingua europea, in particolare se Inglese, mediamente ha una rappresentazione più compatta dei testi in altre lingue. Tanto è stato fatto e si sta facendo per supportare le lingue meno diffuse, anche quelle parlate da pochi milioni (o poche migliaia) di persone. Centri di ricerca, istituzioni internazionali e volontari lavorano per aggiungere nuove lingue ad ogni successiva release di Unicode. Le ultime versioni di Unicode consentono di rappresentare anche gli alfabeti di molte lingue antiche. 8. Gli "script" in Unicode In Unicode esistono più di 100 script. Uno "script" è una specie di alfabeto, cioè un repertorio di lettere e di altri caratteri o segni ausiliari usati per rappresentare il testo in un sistema di scrittura. Alcuni script, sono 1:1 con una lingua; altri, come lo script "Latin" ne supportano molte; per esempio, lo script Latin supporta numerose lingue europee, ma anche il Latino, il Turco (che fino a 1 secolo fa usava i caratteri arabi) e addirittura la lingua Vietnamita (per eredità dal Portoghese). Mentre Unicode nel suo complesso è governato da un consorzio internazionale, la configurazione dei singoli script è demandata a comitati locali, che applicano indirizzi diversificati. Per esempio sia l'Arabo che l'Ebraico hanno delle lettere la cui forma può cambiare a seconda che occorrano a inizio parola, a fine parola o in posizione intermedia; per tali forme vanno usati caratteri (code point) diversi? Per l'Ebraico sì, l'Arabo preferisce di no: nel caso di un testo Arabo è compito del word processor (o del browser web, o del sistema di composizione tipografico) modificare in base al contesto la forma in cui è visualizzato il carattere, e magari di legarlo a quelli adiacenti. 9. Le categorie dei code point Unicode assegna alcune proprietà ad ogni carattere (code point). Queste proprietà possono essere usate per trattare i caratteri all'interno di processi, come nello spezzare il testo in linee, scriverlo da sinistra a destra o da destra a sinistra, ecc. La proprietà più importante è la "categoria generale", che distingue tra cifre, lettere, segni di interpunzione, marcature, ecc. Le categorie a cui appartengono i caratteri Unicode, ed eventualmente i valori delle altre proprietà, possono essere usate dai diversi linguaggi di programmazione nell'implementare funzionalità importanti per il trattamento dei testi, come le espressioni regolari; per esempio in queste ultime il meta-carattere "w", che denota la classe dei caratteri ammessi all'interno di una parola (word), è applicabile a tutti i testi, anche quando contengono un mix di lingue e di script Unicode. RIFERIMENTI (webography) [1] Richard Ishida, Character encodings for beginners, W3C, https://www.w3.org/International/questions/qa-what-is-encoding, Updated 2015-04-16 [2] Joel Spolsky, The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!), blog Joel on Software, https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/ [3] Johannes Bergerhausen, Decode unicode - the world's writing systems (video), presented at TEDx 2013 Vienna, https://www.youtube.com/watch?v=IRdupNXpm8k [4] Ethnologue - Languages of the World, https://www.ethnologue.com/browse [5] Script (Unicode), https://en.wikipedia.org/wiki/Script_(Unicode) [6] Unicode character property, https://en.wikipedia.org/wiki/Unicode_character_property [7] Marco Cimarosti, Dodici anni di Unicode, in Progetto grafico, luglio 2003, http://web.tiscali.it/marco.cimarosti/pro_graf.html DA WIKIPEDIA Teleprinter, https://en.wikipedia.org/wiki/Teleprinter Telescrivente, https://it.wikipedia.org/wiki/Telescrivente ARPANET, https://en.wikipedia.org/wiki/ARPANET ARPANET, https://it.wikipedia.org/wiki/ARPANET ASCII, https://it.wikipedia.org/wiki/ASCII ASCII, https://en.wikipedia.org/wiki/ASCII