1. Introduzione
Immagina di essere un diplomatico a un vertice internazionale: ognuno parla la sua lingua e usa la sua scrittura. Per capirsi serve un traduttore universale — un insieme di regole condivise per mappare i simboli. Nei computer questo ruolo è svolto dalle codifiche.
Il computer capisce un unico "linguaggio": sequenze di zero e uno. 0 e 1 sono il suo "alfabeto". Tutte le informazioni sono memorizzate e trasmesse come byte. Un byte è 8 bit (per esempio, 01000001).
Come colleghiamo le nostre lettere e i nostri segni ai byte? Come fa il computer a capire che la lettera «А» non è solo una sequenza di 0/1, ma proprio quel simbolo sullo schermo?
Codifica
La codifica è un insieme di regole (una tabella di corrispondenza) che definisce come ogni carattere (lettera, cifra, segno, geroglifico, emoji) viene trasformato in una sequenza di byte e come poi quei byte vengono interpretati di nuovo come caratteri.
L'analogia è l'alfabeto Morse: traduci il testo in punti e linee, invii il messaggio e il ricevente, seguendo le stesse regole, ricostruisce i simboli. Nel computer la convenzione "byte ↔ caratteri" è la codifica.
2. Perché ci serve tutta questa rogna con le codifiche?
- Traduzione tra il mondo umano e quello macchina: senza codifica il testo è solo una sequenza di byte; con la codifica ha senso come caratteri.
- Universalità e compatibilità: diversi programmi e sistemi operativi devono "mettersi d'accordo" sulle regole. Se un file è dichiarato come UTF-8, va letto come UTF-8.
- Supporto per molte lingue e simboli: cirillico, scritture arabe, ideogrammi, simboli matematici, emoji — più ampio è il set di caratteri, più complessa e flessibile deve essere la codifica.
3. ASCII – la codifica "primitiva"
Una delle codifiche più antiche e basilari è ASCII (American Standard Code for Information Interchange). Usa 7 bit per carattere, quindi può rappresentare 128 simboli diversi: l'alfabeto latino (A-Z, a-z), cifre (0-9), punteggiatura e codici di controllo (per es. newline, tab).
| Simbolo | Codice decimale (ASCII) | Codice binario (7 bit) |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Spazio | |
|
Storicamente l'ottavo bit veniva spesso usato per il bit di parità, e poi è stato sfruttato nelle "estensioni" di ASCII — così sono nati diversi set di un byte per le varie localizzazioni, il che ha portato a molta confusione.
Se scrivi "Hello", su disco sarà più o meno così (1 byte per carattere; per il ASCII a 7 bit il bit più significativo è zero):
H (01001000) e (01100101) l (01101100) l (01101100) o (01101111)
Semplice. Ma dove stanno le lettere russe o gli ideogrammi? In ASCII non ci sono — è un "dizionario monolingue", buono solo per il set latino base.
4. "Caratteri illeggibili" — perché la codifica non è uno scherzo
A volte, aprendo un file, vedi qualcosa tipo Привет invece di «Привет». Questo si chiama "caratteri illeggibili" (o Mojibake) — risultato della lettura di byte con la codifica sbagliata.
Supponiamo che tu abbia salvato «Ciao, mondo!» in codifica Windows-1251, dove i byte per le lettere russe di «Привет» possono essere così (semplificato):
- П → 207
- р → 240
- и → 232
- в → 226
- е → 229
- т → 242
Poi il tuo collega apre il file con un editor che si aspetta ISO-8859-1 (Latin-1), oppure hai usato StreamReader senza specificare la codifica e quella non coincide con la codifica del file. Risultato: il byte 207 viene interpretato come un carattere di un'altra tabella — e il testo “si rompe”.
| Simbolo originale (Windows-1251) | Rappresentazione in byte (esempio) | Carattere letto come ISO-8859-1 |
|---|---|---|
| П | |
Ç |
| р | |
à |
| и | |
è |
| в | |
â |
| е | |
å |
| т | |
ò |
Alla fine otteniamo Çàèâåò invece di «Ciao». Se un carattere non esiste nella codifica prevista, vedrai quadrati o punti interrogativi.
La conclusione pratica è semplice: quando leggi/scrivi testo è importante specificare esplicitamente la codifica, soprattutto se la sorgente dei dati non è sotto il tuo controllo. In .NET lo fai passando la Encoding corretta a StreamReader/StreamWriter (per esempio, UTF-8 o Encoding.GetEncoding("windows-1251")). Questo aiuta a evitare i caratteri illeggibili e garantisce uno scambio corretto di dati tra sistemi.
Nelle prossime lezioni impareremo a scegliere e specificare con sicurezza la codifica quando lavoriamo con file e stream, così il tuo codice sarà universale, internazionale e affidabile.
GO TO FULL VERSION