CODIFICA ASCII
sistema binario
ASCII (acronimo di American Standard Code for Information Interchange, Codice Standard Americano per lo Scambio di Informazioni) è un codice per la codifica di caratteri. Lo standard ASCII è stato pubblicato dall’American National Standards Institute (ANSI) nel 1968. In italiano viene pronunciato aschi /ˈaski/ o asci /ˈaʃʃi/, mentre la pronuncia originale inglese è askey /ˈæski/. Alla specifica iniziale basata su codici di 7 bit fecero seguito negli anni molte proposte di estensione ad 8 bit, con lo scopo di raddoppiare il numero di caratteri rappresentabili. Nei PC IBM si fa per l’appunto uso di una di queste estensioni, ormai standard de facto, chiamata extended ASCII o high ASCII. In questo ASCII esteso, i caratteri aggiunti sono vocali accentate, simboli semigrafici e altri simboli di uso meno comune. I caratteri di ASCII esteso sono codificati nei cosiddetti codepage. Il termine ASCII esteso (in inglese extended ASCII o high ASCII) designa una codifica a 8 bit o più, in grado di rappresentare molti altri caratteri oltre ai tradizionali 128 dell’ASCII a 7 bit. L’utilizzo di questo termine è stato spesso criticato in quanto potrebbe lasciar intendere (erroneamente) che l’ASCII sia stato aggiornato o che si tratti della stessa codifica. Una nuova codifica chiamata Unicode fu sviluppata nel 1991 per poter codificare più caratteri in modo standard e permettere di utilizzare più set di caratteri estesi (es. greco e cirillico) in un unico documento; questo set di caratteri è oggi largamente diffuso. Inizialmente prevedeva 65.536 caratteri (code points) ed è stato in seguito esteso a 1.114.112 (= 220 + 216) e finora ne sono stati assegnati circa 101.000. I primi 256 code point ricalcano esattamente quelli dell’ISO 8859-1. La maggior parte dei codici sono usati per codificare lingue come il cinese, il giapponese ed il coreano. l’UNICODE usa 4 byte, ma non sempre come vedremo, altrimenti sarebbe un enorme spreco di RAM che è una risorsa molto preziosa.
LINK CODICI ASCII
Sotto è riportato il link contenente la tabella dei codici ascii estesa.
LA CODIFICA UNICODE
Unicode è un sistema di codifica che assegna un numero univoco ad ogni carattere usato per la scrittura di testi, in maniera indipendente dalla lingua, dalla piattaforma informatica e dal programma utilizzato. Unicode era stato originariamente pensato come una codifica a 16 bit (quattro cifre esadecimali) che dava la possibilità di codificare 65.535 (216 -1) caratteri. Tanto si riteneva essere sufficiente per rappresentare i caratteri impiegati in tutte le lingue scritte del mondo. Ora invece lo standard Unicode, che tendenzialmente è perfettamente allineato con la norma ISO/IEC 10646, prevede una codifica fino a 21 bit e supporta un repertorio di codici numerici che possono rappresentare circa un milione di caratteri. Ciò appare sufficiente a coprire anche i fabbisogni di codifica di scritti del patrimonio storico dell’umanità, nelle diverse lingue e negli svariati sistemi di segni utilizzati. Al 2009, solo una piccolissima parte di questa disponibilità di codici è assegnata. Per lo sviluppo dei codici sono infatti previsti 17 “piani” (“planes”, in inglese), da 00 a 10hex, ciascuno con 65.536 posizioni (quattro cifre esadecimali), ma solo i primi tre e gli ultimi tre piani sono ad oggi assegnati, e di questi il primo, detto anche BMP, è praticamente sufficiente a coprire tutte le lingue più usate. Concretamente, questo repertorio di codici numerici è serializzato mediante diversi schemi di ricodifica, che consentono l’uso di codici più compatti per i caratteri usati più di frequente. È previsto l’uso di codifiche con unità da 8 bit (byte), 16 bit (word) e 32 bit (double word), descritte rispettivamente come UTF-8, UTF-16 e UTF-32.
IL BASIC MULTILANGUAL PLAN(BMP)
In questo schema ogni singolo quadratino rappresenta 256 caratteri, ogni simbolo o carattere è chiamato code point. Nel blocco 00 per non rompere la compatibilità con i programmi preesistenti sono stati riportati tutti i 127 caratteri comuni a tutti i paesi. Dal 128 in poi questa volta sono stati prefissati per tutti. Quello rappresentato in figura è chiamato plain (piano) ogni piano contiene 65536 code point, sembrano già un’infinità, in realtà di piani ne esistono ben 17. Il piano che abbiamo appena discusso si chiama Basic Multilingual Plain (BMP). Le coordinate di ogni code point sono identificate da 6 cifre esadecimali (3 byte), due cifre per identificare il piano, il primo avrà coordinata 00 e identifica il BMP, quattro cifre esadecimali per rappresentare ogni singolo code point all’interno di un piano. Il primo piano, il piano BMP contiene caratteri per quasi tutte le lingue moderne e un gran numero di simboli. Un obiettivo primario per il BMP è supportare l’unificazione dei set di caratteri precedenti e dei caratteri per la scrittura. La maggior parte dei code point assegnati nel BMP viene utilizzata per codificare i caratteri cinesi, giapponesi e coreani (CJK). 65.472 dei 65.536 code point in questo piano sono stati assegnati a un blocco Unicode, lasciando solo 64 code point in intervalli non allocati (48 code point da 0870 a 089F e 16 code point da 2FE0 a 2FEF).
SCHEMA DEI 17 PIANI UNICODE
SCHEMA DEL BMP
LE CODIFICHE DEI CARATTERI UTF-8, UTF-16, UTF32
Sono stati introdotti diversi encoding (codifica) dei caratteri, UTF-8, UTF-16, UTF-32. (UTF Unicode Transformation Format). Queste codifiche sfruttano la diversa frequenza di un certo simbolo nelle diverse lingue, ci saranno caratteri usati maggiormente e caratteri raramente usati. Per questo motivo è stata introdotta la codifica a lunghezza variabile. L’idea che sta alla base è di usare meno byte per i code point più frequenti e più byte per quelli meno frequenti.
LA CODIFICA UTF-8
UTF-8 usa da 1 a 4 byte per rappresentare un carattere Unicode. Per esempio un solo byte è necessario per rappresentare i 128 caratteri dell’alfabeto ASCII, corrispondenti alle posizioni Unicode da U+0000 a U+007F. Quattro byte possono sembrare troppi per un solo carattere; tuttavia questo è richiesto solo per i caratteri che stanno fuori dal Basic Multilingual Plane, generalmente molto rari. Inoltre anche UTF-16 (la principale alternativa a UTF-8) richiede quattro byte per questi caratteri. Quale sia più efficiente, UTF-8 o UTF-16, dipende dall’intervallo di caratteri utilizzati, e l’uso di algoritmi di compressione tradizionali riduce in maniera significativa la differenza tra le due codifiche. Per brevi brani di testo, su cui gli algoritmi di compressione tradizionali non sono efficienti e una ridotta occupazione di memoria è importante si potrebbe utilizzare lo Schema di compressione standard per Unicode. La IETF (Internet Engineering Task Force) richiede che tutti i protocolli Internet identifichino la codifica dei caratteri utilizzata, e che siano in grado di utilizzare almeno UTF-8. UTF-8 viene descritto nello standard RFC 3629 (UTF-8, un formato di trasformazione dell’ISO 10646). Brevemente, i bit che compongono un carattere Unicode vengono suddivisi in gruppi, che vengono poi ripartiti tra i bit meno significativi all’interno dei byte che formano la codifica UTF-8 del carattere. I caratteri il cui valore Unicode è inferiore a U+0080 vengono rappresentati con un singolo byte contenente il loro valore; essi corrispondono esattamente ai 128 caratteri ASCII. In tutti gli altri casi sono necessari fino a 4 byte, ognuno di questi con il bit più significativo impostato a 1, in modo da distinguerli dalla rappresentazione dei caratteri dell’alfabeto ASCII a 7 bit, in particolare quelli il cui codice Unicode è inferiore a U+0020, tradizionalmente utilizzati come caratteri di controllo. Chiunque legga un sito web in inglese o un’e-mail in giapponese non solo parla entrambe le lingue, ma è molto probabilmente anche testimone del trionfo della codifica UTF-8. “UTF-8” è l’abbreviazione di “8-Bit UCS Transformation Format” e rappresenta la codifica di caratteri più diffusa nel World Wide Web. Lo standard internazionale Unicode copre tutti i caratteri linguistici e gli elementi di testo di (quasi) tutte le lingue del mondo per l’elaborazione EDP. La codifica UTF-8 gioca un ruolo fondamentale nel set di caratteri Unicode.
Per esempio, il carattere alef (א), corrispondente all’Unicode U+05D0, viene rappresentato in UTF-8 con questo procedimento: ricade nell’intervallo da 0x0080 a 0x07FF. Secondo la tabella verrà rappresentato con due byte (110XXXXX 10XXXXXX); l’esadecimale 0x05D0 equivale al binario 101-1101-0000; gli undici bit vengono copiati in ordine nelle posizioni marcate con “X”: 110-10111 10-010000; il risultato finale è la coppia di byte 11010111 10010000, o in esadecimale 0xD7 0x90. Riassumendo, i primi 128 caratteri vengono rappresentati con un singolo byte. I successivi 1920 ne richiedono due, e comprendono gli alfabeti Latino con diacritici, Greco, Cirillico, Copto, Armeno, Ebraico e Arabo. I restanti caratteri nel Basic Multilingual Plane hanno bisogno di tre byte, tutto il resto di quattro.
APPROFONDIMENTO SULLA CODIFICA UTF-8
UTF-8 è una codifica di caratteri che assegna a ogni carattere Unicode esistente una specifica sequenza di bit, che può essere letta anche come numero binario. Questo significa che UTF-8 assegna un numero binario fisso a ogni lettera, numero e simbolo di un numero crescente di lingue. Le organizzazioni internazionali, che sono particolarmente interessate agli standard Internet e di conseguenza alla loro uniformazione, stanno lavorando per rendere UTF-8 il modello di codifica per eccellenza. Alcuni esempi sono il W3C e l’Internet Engineering Task Force. Già nel 2009 infatti, la maggior parte dei siti web nel mondo utilizzava la codifica UTF-8. Secondo un rapporto del W3Techs del marzo 2018, il 90,9% di tutti i siti web esistenti utilizza questa codifica di caratteri.
Problemi prima dell’introduzione di UTF-8
Regioni diverse con lingue e sistemi di scrittura imparentati avevano sviluppato ciascuna i propri standard di codifica per soddisfare esigenze diverse. Nei paesi anglofoni, ad esempio, era sufficiente la codifica ASCII, la cui struttura consente l’assegnazione di 128 caratteri a una sequenza di caratteri leggibile al computer. Le scritture asiatiche o l’alfabeto cirillico utilizzano, tuttavia, caratteri singoli più univoci. Anche le dieresi tedesche (come la lettera ä) mancano nell’ASCII. Esisteva la possibilità che le assegnazioni di codifiche diverse si sovrapponessero. Questo significa che, ad esempio, un documento scritto in russo poteva apparire su un computer americano con le lettere latine assegnate a questo sistema invece che in lettere cirilliche. Risultati di questo genere hanno ovviamente reso la comunicazione internazionale molto più difficile.
NASCITA DI UTF-8
Per risolvere questo problema Joseph D. Becker sviluppò il set di caratteri universale Unicode per Xerox tra il 1988 e il 1991. Dal 1992 anche il consorzio industriale informatico X/Open era alla ricerca di un sistema per sostituire ASCII ed espandere il suo repertorio di caratteri. Un requisito importante era che tale codifica fosse compatibile con ASCII. Tuttavia la prima codifica, chiamata UCS-2, non soddisfaceva questo requisito e si limitava a convertire il valore numerico dei caratteri in valori a 16 bit. L’obiettivo di compatibilità non fu raggiunto nemmeno dalla codifica UTF-1, dato che le assegnazioni Unicode si sovrapponevano in parte con quelle dei caratteri ASCII esistenti. Un server impostato su ASCII, pertanto, poteva facilmente produrre caratteri errati. Questo rappresentava un problema considerevole, dato che all’epoca la maggior parte dei computer anglofoni lavorava con questa codifica. Il tentativo successivo fu quello del File System Safe UCS Transformation Format (FSS-UTF) di Dave Prosser, che risolse il problema della sovrapposizione con i caratteri ASCII. Nell’agosto dello stesso anno il progetto si diffuse tra gli esperti. All’epoca nei Bell Labs, noti per i numerosi premi Nobel, lavoravano al sistema operativo Plan 9 i cofondatori di Unix Ken Thompson e Rob Pike, che ripresero l’idea di Prosser, sviluppando una codifica in grado di auto-sincronizzarsi (ogni carattere indica di quanti bit ha bisogno) e stabilendo regole per l’assegnazione di caratteri che potevano essere rappresentati in modo diverso nel codice (esempio: “ä” come carattere proprio o “a+¨”). Hanno sfruttato questa codifica con successo per il loro sistema operativo, presentandola in seguito ai responsabili. Nacque così la codifica FSS-UTF, oggi nota come “UTF-8”.
UTF-8 NEL SET DI CARATTERI UNICODE: UNO STANDARD PER TUTTE LE LINGUE
La codifica UTF-8 è un formato di conversione appartenente allo standard Unicode. Il set di caratteri Unicode viene definito a grandi linee nello standard internazionale ISO 10646, che lo indica con il termine “Universal Coded Character Set”. Per garantire più praticità nell’uso, gli sviluppatori dello standard hanno deciso di limitarne alcuni parametri. Lo standard ha lo scopo di garantire una codifica di caratteri ed elementi di testo uniforme e compatibile a livello internazionale. Quando fu introdotto, nel 1991, lo standard Unicode definì 24 moderni sistemi di scrittura e simboli di valuta per l’elaborazione dei dati. Nel giugno 2017 erano 139. Esistono diversi formati di conversione Unicode, i cosiddetti “UTF”, che riproducono gli 1.114.112 punti di codice possibili. I formati che hanno prevalso sono tre: UTF-8, UTF-16 e UTF-32. Anche altre codifiche come UTF-7 o SCSU hanno i loro vantaggi, ma non si sono mai affermate. Unicode è diviso in 17 piani, ognuno dei quali contiene 65.536 caratteri. Ogni piano è composto da 16 colonne e 16 righe. Il primo piano, chiamato “Basic Multilingual Plane” (piano 0), copre la maggior parte dei sistemi di scrittura attualmente utilizzati nel mondo, così come i segni di punteggiatura, i caratteri di controllo e i simboli. Attualmente sono in uso altri cinque piani:
- Supplementary Multilingual Plane (piano 1): sistemi di scrittura antichi, caratteri usati raramente
- Supplementary Ideographic Plane (piano 2): caratteri ideografici rari CJK (“cinese, giapponese, coreano”)
- Supplementary Special-Purpose Plane (piano 14): singoli caratteri di controllo
- Supplementary Private Use Area – A (piano 15): uso privato
- Supplementary Private Use Area – B (piano 16): uso privato
Le codifiche UTF consentono di accedere a tutti i caratteri Unicode. Grazie alle rispettive caratteristiche i singoli piani possono essere sfruttati per contesti diversi.
LE ALTERNATIVE: UTF-32 e UTF-16
UTF-32 utilizza sempre sequenze di numeri a 32 bit, ovvero 4 byte. La semplicità della sua struttura migliora la leggibilità del formato. Nelle lingue che utilizzano principalmente l’alfabeto latino e quindi solo i primi 128 caratteri, questa codifica occupa molta più memoria del necessario (4 byte invece di 1). UTF-16 si è affermato come formato di visualizzazione in sistemi operativi come Apple macOS e Microsoft Windows e viene utilizzato anche in molti framework di sviluppo software. È una delle codifiche UTF più vecchie ancora in uso. La sua struttura è particolarmente adatta per la codifica di caratteri in lingua non latina, perché occupa poco spazio in memoria. La maggior parte dei caratteri può essere rappresentata con 2 byte (16 bit). Solo in caso di caratteri rari la lunghezza può raddoppiare fino a 4 byte.
EFFICIENTE E SCALABILE: UTF-8
UTF-8 è costituito da un massimo di quattro sequenze di bit, ciascuna delle quali è composta da 8 bit. Il predecessore ASCII invece usa sequenze di bit composte da 7 bit. Entrambe le codifiche definiscono i primi 128 caratteri codificati in modo equivalente. Ciascuno dei caratteri provenienti principalmente dal mondo anglofono è dunque coperto da un byte. Per le lingue con alfabeto latino, questo formato garantisce un utilizzo più efficiente dello spazio di archiviazione. I sistemi operativi Unix e Linux lo utilizzano internamente. La codifica UTF-8 svolge il suo ruolo più importante tuttavia in relazione alle applicazioni Internet, in particolare nella rappresentazione di testi sul World Wide Web o nella posta elettronica.
Grazie alla struttura auto-sincronizzante, la leggibilità viene mantenuta nonostante la lunghezza variabile per carattere. Senza la restrizione Unicode UTF-8 potrebbe codificare un totale di 231 (= 4.398.046.511.104) caratteri. Quelli effettivi sono 221, per via del limite dei 4 byte imposto dallo standard Unicode, il che è più che sufficiente. Lo stesso standard Unicode ha ancora dei piani vuoti per molti altri sistemi di scrittura.
L’assegnazione esatta evita sovrapposizioni tra punti di codice, che in passato hanno ostacolato la comunicazione. Anche UTF-16 e UTF-32 garantiscono un’assegnazione esatta, ma UTF-8 utilizza lo spazio di archiviazione in modo particolarmente efficiente per il sistema di scrittura latino ed è progettato per consentire la coesistenza semplice e la copertura di diversi sistemi di scrittura, permettendone la visualizzazione simultanea e sensata all’interno di un campo di testo senza problemi di compatibilità.
NOZIONI DI BASE: CODIFICA E COMPOSIZIONE DI UTF-8
La codifica UTF-8 offre diversi vantaggi come la retro compatibilità con ASCII e la sua struttura auto-sincronizzante che facilita agli sviluppatori l’identificazione di fonti di errore anche in un secondo momento. UTF utilizza solo 1 byte per ciascuno dei caratteri ASCII. Il numero totale di sequenze di bit può essere riconosciuto dalle prime cifre del numero binario. Poiché il codice ASCII è composto solo da 7 bit, la prima cifra è 0. Lo 0 occupa lo spazio di archiviazione corrispondente a un byte completo e segnala l’inizio di una sequenza senza byte successivi. Se codificassimo il nome “UTF-8” come numero binario con la codifica UTF-8, questo apparirebbe come segue:
La codifica UTF-8 assegna i caratteri ASCII, come quelli usati nella tabella, a una singola sequenza di bit. Tutti i caratteri seguenti e simboli all’interno dello standard Unicode sono composti da due a quattro sequenze a 8 bit. La prima sequenza è lo start byte, o byte iniziale, le sequenze successive sono invece i byte successivi. Gli start byte con byte successivi iniziano sempre con 11. I byte successivi, invece, iniziano sempre con 10. Se cercate manualmente un determinato punto nel codice, potete dunque riconoscere l’inizio di un carattere codificato dai marcatori 0 e 11. Il primo carattere stampabile a più byte è il punto esclamativo invertito:
CODIFICA DEL PREFISSO
La codifica del prefisso impedisce che all’interno di una sequenza di byte venga codificato un altro carattere. Se un flusso di byte inizia nel mezzo di un documento, il computer visualizza comunque correttamente i caratteri leggibili, poiché quelli incompleti non vengono rappresentati affatto. Se cercate l’inizio di un carattere, tenendo a mente il limite dei 4 byte, dovete tornare indietro in qualsiasi punto di un massimo di tre sequenze di byte per trovare quello iniziale. Un altro elemento importante a livello strutturale è che la quantità di 1 all’inizio dello start byte indica la lunghezza della sequenza di byte. Come mostrato sopra, 110xxxxx sta per 2 byte. 1110xxxx sta per 3 byte e 11110xxx per 4 byte. In Unicode il valore di byte assegnato corrisponde al numero del carattere, consentendo un ordine lessicale. Tuttavia ci sono delle lacune. L’intervallo Unicode da U+007F a U+009F include numeri di controllo non assegnati. In questo intervallo lo standard UTF-8 non assegna caratteri stampabili, ma solo comandi. La codifica UTF-8 può, come accennato sopra, unire teoricamente fino a otto sequenze di byte, ma Unicode prescrive una lunghezza massima di 4 byte. Di conseguenza, le sequenze di byte composte da 5 o più byte sono invalide di default. D’altra parte, questa limitazione riflette l’obiettivo di rappresentare il codice in modo più compatto, ovvero nella maniera più efficiente, in termini di spazio di archiviazione, e più strutturata possibile. Una regola di base nell’utilizzo di UTF-8 prevede la predilezione della codifica più breve possibile. La lettera ä, ad esempio, viene codificata utilizzando 2 byte: 11000011 10100100. Teoricamente si potrebbero combinare i punti di codice della lettera a(01100001) e del carattere di dieresi ¨ (11001100 10001000) per rappresentare la ä: 01100001 11001100 10001000. Nel caso di UTF-8 questa forma è tuttavia considerata una codifica troppo estesa e quindi inammissibile. Alcuni intervalli di valori Unicode non sono stati definiti per UTF-8 perché restino a disposizione dei surrogati UTF-16. La panoramica mostra quali byte in UTF-8, nello standard Unicode, sono validi secondo l’Internet Engineering Task Force (IETF) (gli intervalli contrassegnati in verde sono byte validi, quelli contrassegnati in rosso non sono validi).
ESEMPIO
Il carattere ᅢ (Manul Junseong, Ä) corrisponde in Unicode a U+1162.
Il codice UTF-8 prevede 3 byte per il punto di codice U+1162, perché il punto di codice si trova nell’intervallo tra U+0800 e U+FFFF. Lo start byte inizia quindi con 1110. I due byte successivi iniziano ciascuno con 10. Nei bit liberi, che non specificano la struttura, aggiungete il numero binario da destra a sinistra. Riempite le restanti posizioni di bit nel byte iniziale con 0 fino a quando l’ottetto non è completo. Si ottiene dunque la seguente codifica UTF-8:
11100001 10000101 10100010 (il punto di codice inserito è in grassetto).
STAMPARE UN CARATTERE UNICODE SU WORD
In base a questa tabella vediamo che codificare un testo che usa i 127 caratteri del codice ASCII con l’UTF-16 o ancor peggio con l’UTF-32 sarebbe solo uno spreco di ram.
Link alla pagina Wikipedia contenente tutti i plan.
https://en.wikipedia.org/wiki/Plane_%28Unicode%29
Proviamo a stampare su word un carattere che si trova nel BMP.
说 Questo ideogramma si trova nell’intervallo 8000-8FFF nel BMP all’indirizzo 8BF4
Trasformiamo il numero esadecimale in decimale.
4×160 + 15X161 + 11X162 + 8×163 = 4 + 240 + 2816 + 32768 = 35828
Infine stampiamo l’ideogramma su word premendo alt, attivando il tastierino numerico, e scrivendo la sequenza 35828.
说
APPROFONDIMENTO AI
La codifica dei caratteri è un sistema che permette di rappresentare testi e simboli all’interno di un computer, in sistemi elettronici di comunicazione, o in qualsiasi dispositivo che gestisca l’elaborazione di dati. Ogni carattere (lettera, numero, simbolo) viene convertito in una sequenza di bit (0 e 1), che è la forma base di informazione che un computer può gestire.
1. Cos’è un carattere?
Un carattere può essere una lettera dell’alfabeto (come ‘A’, ‘B’, ‘C’), un numero (come ‘1’, ‘2’, ‘3’), un simbolo (come ‘%’, ‘&’, ‘@’) o anche un segno di punteggiatura. Ogni carattere che vediamo su uno schermo o che inseriamo tramite una tastiera deve essere tradotto in una rappresentazione che il computer possa comprendere.
2. Cos’è una codifica di caratteri?
Una codifica dei caratteri è una mappatura tra i caratteri e numeri binari (sequenze di bit). Ad esempio, nella codifica ASCII, il carattere ‘A’ è rappresentato dal numero decimale 65, che in binario è ‘01000001’. Quando il computer riceve il codice binario, sa quale carattere mostrare.
3. Standard di codifica principali
Ci sono diverse codifiche di caratteri utilizzate nel corso del tempo. Le principali sono:
ASCII (American Standard Code for Information Interchange)
•ASCII è una delle prime codifiche dei caratteri. Utilizza 7 bit per rappresentare un totale di 128 caratteri. Include le lettere dell’alfabeto inglese, numeri e simboli speciali. ASCII copre i caratteri di base necessari per la lingua inglese e un insieme limitato di caratteri di controllo (come il ritorno a capo o il tab).
•Esempio:
•‘A’ è rappresentato dal codice 65 (in decimale), che in binario è ‘01000001’.
•‘a’ è rappresentato dal codice 97 (in decimale), che in binario è ‘01100001’.
ISO-8859-1 (Latin-1)
•ISO-8859-1, noto anche come Latin-1, estende ASCII a 8 bit, permettendo la rappresentazione di 256 caratteri. Questa codifica è progettata per supportare le lingue dell’Europa occidentale. Include lettere accentate (come ‘é’, ‘à’) e altri simboli speciali.
•Esempio:
•‘é’ è rappresentato dal codice 233 (in decimale), che in binario è ‘11101001’.
UTF-8 (Unicode Transformation Format – 8-bit)
•UTF-8 è la codifica più utilizzata oggi. Fa parte dello standard Unicode, che è progettato per rappresentare tutti i caratteri di tutte le lingue del mondo, nonché simboli matematici, emoji, e molto altro. UTF-8 usa da 1 a 4 byte (8-32 bit) per rappresentare i caratteri.
•Vantaggi:
•È compatibile con ASCII: i caratteri ASCII (quelli di base) sono rappresentati esattamente allo stesso modo in UTF-8.
•I caratteri più comuni (ad esempio le lettere dell’alfabeto inglese) sono codificati con 1 byte, mentre i caratteri meno comuni (come quelli cinesi o gli emoji) usano più byte.
•Esempio:
•Il carattere ‘A’ in UTF-8 è ‘01000001’ (come in ASCII).
•Il carattere ‘€’ (euro) è rappresentato con tre byte: ‘11100010 10000010 10101100’.
UTF-16 e UTF-32
•UTF-16 e UTF-32 sono altre codifiche della famiglia Unicode.
•UTF-16 usa 16 o 32 bit (2 o 4 byte) per rappresentare ogni carattere. È usato soprattutto su sistemi Windows e per alcuni protocolli di rete.
•UTF-32 usa sempre 4 byte per ogni carattere. È molto semplice da decodificare (poiché ogni carattere occupa lo stesso spazio), ma è meno efficiente in termini di memoria rispetto a UTF-8.
4. Perché abbiamo bisogno di più codifiche?
Inizialmente, codifiche come ASCII erano sufficienti per la lingua inglese e poche altre lingue. Tuttavia, con la globalizzazione e l’espansione di internet, è diventato necessario supportare un numero maggiore di caratteri. Le lingue con alfabeti diversi (come il cinese, il giapponese, l’arabo) hanno molti più caratteri rispetto all’alfabeto latino usato in inglese, spagnolo o italiano.
Per questo motivo, sono stati sviluppati sistemi di codifica come Unicode (di cui UTF-8 è una variante), in grado di rappresentare qualsiasi carattere in qualsiasi lingua, senza limitazioni di spazio.
5. Esempi pratici: conversione e visualizzazione
Quando digitiamo un carattere sulla tastiera, il sistema operativo traduce il tasto in un codice binario usando una tabella di codifica. Questo codice viene poi passato al computer, che lo visualizza sullo schermo.
•Esempio di conversione ASCII:
Se premi la lettera ‘A’, il computer lo traduce nel codice binario ‘01000001’, che è 65 in decimale.
•Esempio di conversione Unicode:
Se inserisci il simbolo ‘€’ (euro), in UTF-8 il codice sarà ‘11100010 10000010 10101100’, che corrisponde a 0x20AC (decimale 8364) nel sistema Unicode.
6. Problemi di compatibilità
Quando si utilizza una codifica errata, possono apparire simboli strani o punti interrogativi al posto dei caratteri desiderati. Questo accade perché il sistema tenta di interpretare i bit utilizzando una codifica diversa da quella originale. Ad esempio, se un documento scritto in UTF-8 viene letto come ISO-8859-1, i caratteri non ASCII (come ‘é’ o ‘€’) possono essere visualizzati in modo errato.
7. Evoluzione delle codifiche
•ASCII è stata la codifica dominante fino agli anni ’80 e ‘90, ma con l’espansione del web e la necessità di supportare molte più lingue, Unicode e UTF-8 sono diventati gli standard dominanti.
•Oggi, UTF-8 è la codifica preferita sul web, poiché combina efficienza e compatibilità universale.
Conclusione
La codifica dei caratteri è fondamentale per la comunicazione tra sistemi informatici e per garantire che i dati testuali possano essere trasmessi, memorizzati e visualizzati correttamente. L’evoluzione da sistemi limitati come ASCII a sistemi globali come Unicode è stata essenziale per supportare la varietà di lingue e simboli che oggi usiamo su internet e nelle moderne tecnologie.
LA CODIFICA UNICODE
Unicode è uno standard di codifica progettato per rappresentare e gestire testi di qualsiasi sistema di scrittura del mondo, oltre a simboli, emoji e caratteri speciali. L’obiettivo principale di Unicode è quello di fornire un’unica codifica per tutti i caratteri utilizzati nelle diverse lingue e discipline, eliminando le limitazioni e le ambiguità presenti nei sistemi di codifica più vecchi, come l’ASCII e altre codifiche specifiche per singole lingue o regioni.
1. Origini e obiettivi di Unicode
Il progetto Unicode è stato avviato alla fine degli anni ‘80 con l’intento di creare un sistema di codifica universale. Fino a quel momento, esistevano molti standard di codifica locale, come ASCII per l’inglese, ISO-8859-1 per le lingue dell’Europa occidentale e altre codifiche regionali. Questi sistemi potevano rappresentare solo una parte limitata dei caratteri e rendevano difficile lo scambio di dati tra diversi sistemi.
Unicode è stato creato per risolvere questi problemi, fornendo:
•Un codice univoco per ogni carattere.
•Supporto per tutte le lingue scritte, dai sistemi di scrittura più comuni (come latino, arabo e cinese) a quelli meno utilizzati (come lingue antiche o locali).
•Compatibilità con altre codifiche, in particolare con l’ASCII.
2. Cos’è Unicode?
Unicode è uno standard che definisce:
•Un insieme di caratteri universale: rappresenta caratteri di tutte le lingue moderne e molti alfabeti storici, così come simboli, emoji e altri segni.
•Una mappatura numerica: assegna un codice numerico univoco a ciascun carattere, chiamato punto di codice o code point. Questi numeri vengono scritti in notazione esadecimale e vanno da U+0000 a U+10FFFF, coprendo un intervallo di oltre 1 milione di punti di codice.
•Esempio:
•La lettera ‘A’ ha il punto di codice U+0041.
•Il simbolo dell’euro ‘€’ ha il punto di codice U+20AC.
•L’emoji ‘😊’ ha il punto di codice U+1F60A.
3. Punti di codice e piani Unicode
Unicode organizza i punti di codice in piani. Ogni piano contiene un gruppo di caratteri correlati. Attualmente ci sono 17 piani definiti, anche se solo una parte di questi è stata completamente assegnata.
•Piano Multilingue Base (BMP): È il piano più comunemente utilizzato (U+0000 – U+FFFF) e contiene la maggior parte dei caratteri di lingue moderne, simboli e caratteri storici.
•Piani supplementari: Coprono i caratteri meno comuni, inclusi gli emoji, simboli matematici complessi e caratteri di lingue storiche o rare. Ad esempio:
•Piano 1 (U+10000 – U+1FFFF): Contiene antiche lingue storiche.
•Piano 15 e 16: Riservati per usi privati.
4. Formati di codifica Unicode: UTF-8, UTF-16, e UTF-32
I punti di codice Unicode devono essere rappresentati come sequenze di byte per essere memorizzati o trasmessi. Ci sono diversi modi per farlo, chiamati schemi di codifica (UTF – Unicode Transformation Format). I tre principali formati sono:
UTF-8
•UTF-8 è il formato di codifica Unicode più diffuso e utilizzato.
•Usa da 1 a 4 byte per rappresentare ogni carattere:
•Caratteri ASCII (U+0000 – U+007F) usano 1 byte (compatibile con ASCII).
•Altri caratteri usano 2, 3 o 4 byte a seconda del loro punto di codice.
•Vantaggi:
•Efficienza: i caratteri più comuni, come le lettere latine, richiedono solo 1 byte.
•Compatibilità: i documenti scritti in ASCII possono essere letti come UTF-8 senza alcuna conversione.
•Utilizzato ampiamente sul web e in applicazioni moderne.
•Esempio:
•Il carattere ‘A’ (U+0041) è codificato in 1 byte: 01000001.
•Il carattere ‘€’ (U+20AC) è codificato in 3 byte: 11100010 10000010 10101100.
UTF-16
•UTF-16 usa 2 o 4 byte per rappresentare i caratteri:
•I punti di codice nel BMP (da U+0000 a U+FFFF) sono rappresentati con 2 byte.
•I punti di codice supplementari (oltre U+FFFF) richiedono 4 byte.
•Vantaggi:
•È efficiente per rappresentare lingue che utilizzano molti caratteri al di fuori del set ASCII, come il cinese, il giapponese o il coreano.
•Svantaggi:
•Non è compatibile con ASCII.
•Può risultare meno efficiente di UTF-8 per le lingue europee.
UTF-32
•UTF-32 utilizza sempre 4 byte per rappresentare ogni carattere, indipendentemente dal punto di codice.
•Vantaggi:
•Molto semplice da decodificare, perché ogni carattere occupa lo stesso spazio.
•Svantaggi:
•Poco efficiente in termini di utilizzo della memoria: anche i caratteri comuni, come le lettere latine, richiedono 4 byte.
5. Caratteri e blocchi Unicode
Unicode suddivide i suoi caratteri in blocchi che rappresentano specifici gruppi di simboli o alfabeti. Ogni blocco contiene un insieme di punti di codice dedicati a un particolare sistema di scrittura o categoria di caratteri.
•Blocchi per lingue moderne: Latino (A, B, esteso), Greco, Cirillico, Arabo, Cinese, Giapponese, ecc.
•Blocchi di caratteri storici: Etrusco, Egizio, Cuneiforme, ecc.
•Simboli ed emoji: Simboli matematici, frecce, forme geometriche, emoji, ecc.
6. Emoji e Unicode
Le emoji, sempre più popolari, sono parte del set di caratteri Unicode. Ogni emoji ha un proprio punto di codice. Unicode aggiorna periodicamente il suo set di caratteri per includere nuove emoji e simboli che riflettono cambiamenti sociali o culturali.
•Esempio: L’emoji ‘😊’ ha il punto di codice U+1F60A.
7. Come funziona Unicode nella pratica?
Quando scrivi un testo su un dispositivo, ogni carattere che digiti viene convertito in un punto di codice Unicode. Questo codice viene poi trasformato in una sequenza di byte secondo il formato di codifica scelto (UTF-8, UTF-16, o UTF-32). Ad esempio:
•Se digiti ‘Ciao’ in un documento salvato in UTF-8, il testo sarà memorizzato come la sequenza di byte: 43 69 61 6F, dove ogni numero esadecimale rappresenta il corrispondente punto di codice.
Quando il file viene letto, il computer decodifica la sequenza di byte per risalire ai punti di codice e mostrare i caratteri corrispondenti sullo schermo.
8. Problemi di compatibilità
Nonostante Unicode sia lo standard predominante, è ancora possibile imbattersi in problemi di compatibilità quando si utilizzano codifiche diverse. Se un testo Unicode viene interpretato con una codifica sbagliata (ad esempio, UTF-8 letto come ISO-8859-1), potresti vedere caratteri illeggibili o simboli strani al posto del testo corretto.
9. Conclusione
Unicode ha rivoluzionato il modo in cui i testi sono rappresentati e gestiti nei sistemi informatici, consentendo una rappresentazione unificata e globale di tutti i caratteri e simboli esistenti. Grazie alla sua flessibilità, efficienza e compatibilità con i sistemi più vecchi, Unicode (soprattutto con la codifica UTF-8) è diventato lo standard di fatto per la comunicazione scritta digitale in tutto il mondo.
Lascia un commento