La struttura di ASCII
ASCII (1963, rivisto nel 1967) è un codice a 7 bit: 128 valori, di cui 33 sono caratteri di controllo e 95 stampabili. La sua disposizione fu progettata per telescriventi meccaniche e hardware che manipolava bit, e il progetto si vede ancora:
- Le maiuscole sono un bit.
Aè 0x41,aè 0x61: differiscono solo nel bit 5 (valore 32).c | 0x20rende minuscola una lettera,c & ~0x20maiuscola ec ^ 0x20la alterna. - Le cifre sono il loro valore più 48.
'7' - '0'fa 7, e il nibble basso del codice di una cifra è la cifra stessa (0x37 → 7). - Ctrl azzera due bit. Ctrl-C invia 0x03 perché C è 0x43 e il terminale azzera i bit 6 e 5 (
c & 0x1F). Per questo Ctrl-D è EOT (4), Ctrl-H è backspace (8), Ctrl-I è tab (9), Ctrl-M è ritorno carrello (13), Ctrl-[ è Escape (27) e Ctrl-@ è NUL. - DEL è 127, tutti e sette i bit a uno, perché perforare tutti i fori su un nastro di carta era il modo per cancellare un carattere.
Oltre 127
Non esiste un «ASCII esteso». I byte 128–255 significavano caratteri diversi in ogni code page (Latin-1, Windows-1252, CP437, KOI8-R, ISO-8859-2 per l’Europa centrale), che è l’origine dei caratteri corrotti come «Ã©» al posto di «é». Unicode le ha sostituite tutte; UTF-8 mantiene i byte 0–127 identici ad ASCII e usa da 2 a 4 byte oltre. L’ispettore Unicode mostra quei byte.
Fine riga
Unix termina le righe con LF (10); Windows con CR LF (13 10); il Mac OS classico usava solo CR. Le telescriventi avevano bisogno di entrambi: il ritorno carrello per riportare la testina e l’avanzamento riga per far scorrere la carta. \r\n nella riga shebang di uno script di shell è ancora la causa più comune degli errori «bad interpreter».
Domande
Qual è il codice ASCII della A?
65 in decimale, 0x41 in hex, 0101 in ottale, 01000001 in binario. La a minuscola è 97 (0x61).
Cosa sono ASCII 10 e 13?
10 è LF (line feed, \n) e 13 è CR (ritorno carrello, \r). Unix usa solo LF; Windows usa CR LF.
Perché Ctrl-C invia 3?
I terminali azzerano i due bit alti del codice della lettera: C è 0x43 = 0100 0011, e 0x43 & 0x1F = 3 (ETX, fine testo). La shell associa ETX a SIGINT.
0xFF o 255 è ASCII?
No. ASCII finisce a 127. 128–255 dipendono dalla code page, e in UTF-8 quei valori di byte compaiono solo come parti di caratteri multibyte.