# Codifica di caratteri

Una codifica di caratteri, o charset, consiste in un codice che associa un insieme di caratteri (tipicamente rappresentazioni di grafemi così come appaiono in un alfabeto utilizzato per comunicare in una lingua naturale) ad un insieme di altri oggetti, come numeri (specialmente nell'informatica) o pulsazioni elettriche, con lo scopo di facilitare la memorizzazione di un testo in un computer o la sua trasmissione attraverso una rete di telecomunicazioni. Esempi comuni sono il Codice Morse e la codifica ASCII.
A seconda del livello di astrazione e del contesto, i punti di codice corrispondenti e lo spazio di codice risultante possono essere considerati come modelli di bit, ottetti, numeri naturali, impulsi elettrici, ecc. Una codifica dei caratteri viene utilizzata nel calcolo, nell'archiviazione dei dati e nella trasmissione di dati testuali. "Set di caratteri", "mappa di caratteri", "set di codici" e "code page" sono termini correlati, ma non identici.
I primi codici di caratteri associati al telegrafo ottico o elettrico potevano rappresentare solo un sottoinsieme dei caratteri usati nelle lingue scritte, a volte limitati a lettere maiuscole, numeri e solo alcuni segni di punteggiatura. Il basso costo della rappresentazione digitale dei dati nei moderni sistemi informatici consente codici di caratteri più elaborati (come Unicode) che rappresentano la maggior parte dei caratteri utilizzati in molte lingue scritte. La codifica dei caratteri utilizzando standard accettati a livello internazionale consente lo scambio di testo in formato elettronico a livello mondiale.

## Storia

La storia dei codici dei caratteri illustra la necessità in evoluzione di informazioni simboliche basate sui caratteri mediate dalla macchina su una distanza, utilizzando mezzi elettrici un tempo nuovi. I primi codici erano basati su sistemi di codifica e cifratura manuali e scritti a mano, come il cifrario di Bacon, il Braille, le bandiere di segnali marittimi internazionali e la codifica a 4 cifre dei caratteri cinesi del codice telegrafico cinese (Hans Schjellerup, 1869). Con l'adozione di tecniche elettriche ed elettromeccaniche questi primi codici furono adattati alle nuove capacità e limitazioni delle prime macchine. Il primo noto codice di caratteri a trasmissione elettrica, il codice Morse, introdotto nel 1840, utilizzava un sistema di quattro "simboli" (segnale breve, segnale lungo, spazio breve, spazio lungo) per generare codici di lunghezza variabile. Sebbene la maggior parte dell'uso commerciale del codice Morse fosse tramite macchinari, era anche usato come codice manuale, generabile a mano su una chiave telegrafica e decifrabile a orecchio, e persiste nell'uso radioamatoriale. La maggior parte dei codici sono di lunghezza fissa per carattere o sequenze di lunghezza variabile di codici di lunghezza fissa (ad esempio Unicode).
L'introduzione delle telescriventi porta al codice Baudot del 1930, a 5 bit. Il codice Baudot, una codifica a cinque bit, è stato creato da Émile Baudot nel 1870, brevettato nel 1874, modificato da Donald Murray nel 1901 e standardizzato da CCITT come International Telegraph Alphabet No. 2 (ITA2) nel 1930. Il nome "baudot" è stato erroneamente applicato a ITA2 e alle sue numerose varianti. ITA2 soffriva di molti difetti ed era spesso "migliorato" da molti produttori di apparecchiature, creando a volte problemi di compatibilità. Nel 1959 l'esercito americano definì il suo codice Fieldata, un codice a sei o sette bit, introdotto dall'US Army Signal Corps. Mentre Fieldata affrontava molti dei problemi allora moderni (ad esempio codici di lettere e cifre predisposti per la collazione delle macchine), Fieldata non raggiunse i suoi obiettivi ed ebbe vita breve. Nel 1963 il primo codice ASCII (American Standard Code for Information Interchange) fu rilasciato (X3.4-1963) dal comitato ASCII (che conteneva almeno un membro del comitato Fieldata, WF Leubbert) che affrontava la maggior parte delle carenze di Fieldata, utilizzando un codice più semplice. Molte delle modifiche erano impercettibili, come i set di caratteri collezionabili all'interno di determinati intervalli numerici. ASCII63 è stato un successo, ampiamente adottato dall'industria, e con il rilascio successivo del codice ASCII del 1967 (che aggiungeva lettere minuscole e risolveva alcuni problemi di "codice di controllo") ASCII67 fu adottato abbastanza ampiamente. La natura americana di ASCII67 è stata in qualche modo tradotta nello standard europeo ECMA-6.
Un po' storicamente isolato, il BCD (Binary Coded Decimal) di IBM era uno schema di codifica a sei bit utilizzato da IBM già nel 1959 nei suoi computer 1401 e 1620 e nelle sue serie 7000 (ad esempio, computer 704, 7040, 709 e 7090), nonché nelle periferiche associate. BCD ha esteso la semplice codifica numerica a quattro bit esistente per includere caratteri alfabetici e speciali, mappandola facilmente alla codifica delle schede perforate che era già ampiamente utilizzata. Era il precursore dell'EBCDIC. Per la maggior parte, i codici IBM sono stati utilizzati principalmente con apparecchiature IBM, che era più o meno un ecosistema chiuso, e non ha visto molta adozione al di fuori dei "circoli" IBM. L'Extended Binary Coded Decimal Interchange Code di IBM (solitamente abbreviato in EBCDIC) è uno schema di codifica a otto bit sviluppato nel 1963.
Nel 1963 nasce lo standard ASCII, a 7 bit, che è utilizzato per la nascita di Internet e dei protocolli connessi. Nel 1965 viene approvato come US-ASCII, che nel 1972 diventa lo standard ISO 646.
Nel tentativo di sviluppare codifiche di caratteri universalmente intercambiabili, i ricercatori negli anni '80 hanno affrontato il dilemma che da un lato sembrava necessario aggiungere più bit per accogliere caratteri aggiuntivi, ma dall'altro lato, per gli utenti del set di caratteri relativamente piccolo dell'alfabeto latino (che costituiva ancora la maggioranza degli utenti di computer), quei bit aggiuntivi erano un colossale spreco di risorse di calcolo allora scarse e costose (poiché sarebbero sempre state azzerate per tali utenti). Nel 1985, il disco rigido dell'utente medio poteva memorizzare solo circa 10 megabyte, quindi era molto importante in quel momento fare in modo che ogni bit contasse.
La soluzione di compromesso che è stata infine trovata e sviluppata in Unicode è stata quella di rompere il presupposto (risalente ai codici telegrafici) che ogni carattere dovrebbe sempre corrispondere direttamente a una particolare sequenza di bit. Invece, i caratteri verrebbero prima mappati su una rappresentazione intermedia universale sotto forma di numeri astratti chiamati punti di codice. I punti di codice sarebbero quindi rappresentati in una varietà di modi e con vari numeri predefiniti di bit per carattere (unità di codice) a seconda del contesto. Per codificare punti di codice superiori alla lunghezza dell'unità di codice, come sopra 256 per unità a 8 bit, la soluzione era implementare codifiche a larghezza variabile in cui una sequenza di escape segnalerebbe che i bit successivi dovrebbero essere analizzati come un punto di codice più alto.
Nel 1981 le estensioni al codice ASCII per i caratteri dal 128 al 255 vengono identificate dai codepage PC-DOS e traslate poi per retrocompatibilità nello MS-DOS. Nel 1985 la ISO approva gli standard codepage come ISO 8859-n, dove n è un numero che identifica il particolare codepage.
L'affermarsi di Windows, anche in Asia, porta alle estensioni alle lingue orientali nel 1990 dei codepage di Windows.
La comprensibile babele risultante dallo scambio di email e documenti tra paesi a codepage diverso fu oggetto di attenzione dell'ISO prima con lo standard del 1986 ISO 2022, in vigore ma scarsamente utilizzato, e poi con la proposta del 1991 dell'Unicode 1.0, la cui versione 1.1 del 1993 divenne lo standard ISO 10646, lo Universal Character Set o UCS.
Lo UCS-2, che usa due byte per ogni carattere, fu utilizzato dalla Microsoft in Windows NT sin dal 1995 e poi esteso a tutte le altre versioni.
Le definizioni dei formati UTF-8 e UTF-16 datano al 1996, con la versione 2.0 di Unicode. lo UTF (Unicode Transformation Format) divenne lo standard POSIX de facto, ed essendo ratificato dalla RFC 3629, è anche riconosciuto dal W3C. Esistono anche lo UTF-7 e l'UCS 4. Lo UTF-16 è un'estensione dello UCS 2.
La successiva versione Unicode 3.0 del 1999 introduce la bidirezionalità e la composizione di tabelle, mentre la 4.0 del 2001 include anche le lingue antiche. La 4.1 è del 2005, ma l'attività del Unicode Consortium è in continua evoluzione.

## Repertori di caratteri

In alcuni contesti, specialmente nella memorizzazione e nella comunicazione, è utile operare una distinzione tra repertorio di caratteri (un insieme completo di caratteri astratti supportato da un certo sistema) e codifica di caratteri, che specifica il sistema da usare per la rappresentazione dei caratteri di un certo insieme utilizzando codici numerici.
Dopo i primi repertori di caratteri (ASCII nel 1963 ed EBCDIC nel 1964) si assistette ad un processo di standardizzazione. Presto divennero evidenti le limitazioni di questi modelli di rappresentazione e si tentò di sviluppare metodi specifici per superarle. In particolare, la necessità di supportare un numero sempre maggiore di caratteri (come richiesto ad esempio dalle codifiche CJK tipiche dell'estremo oriente) rese evidente il bisogno di un approccio sistematico al problema. Un tentativo in tal senso è rappresentato dalla codifica Unicode, il cui repertorio comprende più di centomila caratteri.

## Principali codifiche dei caratteri

* ISO 646
* ASCII
* EBCDIC
* ISO 8859:
** ISO 8859-1 Europa occidentale
** ISO 8859-2 Europa centrale e occidentale
** ISO 8859-3 Europa centrale e meridionale
** ISO 8859-4 Europa occidentale e nazioni baltiche
** ISO 8859-5 Alfabeto cirillico
** ISO 8859-6 Alfabeto arabo
** ISO 8859-7 Alfabeto greco
** ISO 8859-8 Alfabeto ebraico
** ISO 8859-9 Europa occidentale e caratteri turchi
** ISO 8859-10 Europa occidentale e caratteri nordici
** ISO 8859-11 Alfabeto tailandese
** ISO 8859-13 Lingue baltiche e polacco
** ISO 8859-14 Lingue celtiche
** ISO 8859-15 ISO 8859-1 con aggiunta di caratteri (come il simbolo dell'euro)
** ISO 8859-16 Europa centrale (Italia, Germania ed est europeo)
* Insiemi di caratteri DOS:
** CP 437, CP737, CP 850, CP852, CP855, CP857, CP858, CP860, CP861, CP 862, CP863, CP 864, CP865, CP866, CP869
* Insiemi di caratteri Windows:
** Windows-1250 Europa centrale
** Windows-1251 Alfabeto cirillico
** Windows-1252 Europa occidentale
** Windows-1253 Alfabeto greco
** Windows-1254 Alfabeto turco
** Windows-1255 Alfabeto ebraico
** Windows-1256 Alfabeto arabo
** Windows-1257 Alfabeto baltico
** Windows-1258 Alfabeto vietnamita
* KOI8-R, KOI8-U, KOI7
* ISCII
* VISCII
* Big5
** HKSCS
* Guóbiāo
** GB2312
** GB18030
* ISO 2022, IEC, Extended Unix Coding
* Unicode e sottoinsiemi. Vedere UTF-6