martedì 20 novembre 2018

Codifica dei caratteri ASCII, ANSI, Unicode (UTF)

ASCII [1] è l'acronimo di American Standard Code for Information Interchange ed è il primo standard introdotto nella codifica dei caratteri di scrittura nel campo dell'IT (Information Techology). Il codice ASCII è definito nella norma ISO/IEC 646 - Information technology - ISO 7-bit coded character set for information interchange [2].

Nel codice ASCII i caratteri sono codificati con 7 bit cosa che permette di codificare 27 = 128 caratteri numerati da 0 a 127I concetti alla base dello standard sono semplici e pratici:
→ codificare i caratteri di controllo ovvero i comandi necessari per poter gestire da remoto una stampante (originariamente una telescrivente);
→ codificare i caratteri stampabili - lettere, numeri, segni di interpunzione e simboli - di impiego più frequente nella scrittura di un testo.

I caratteri da 0 a 31 sono caratteri di controllo e non sono stampabili. Il carattere 32 corrisponde a uno spazio. I caratteri da 33 a 126 sono caratteri stampabili. Il carattere 127 corrisponde a Delete (ed è equivalente a Backspace).

Questo è il set di caratteri ASCII standard altrimenti noto come set di caratteri ASCII di base:

Codice Simbolo Codice Carattere Codice Carattere Codice Carattere
0 NUL 32
64 @ 96 `
1 SOH 33 ! 65 A 97 a
2 STX 34 " 66 B 98 b
3 ETX 35 # 67 C 99 c
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACK 38 & 70 F 102 f
7 BEL 39 ' 71 G 103 g
8 BS 40 ( 72 H 104 h
9 TAB 41 ) 73 I 105 i
10 LF 42 * 74 J 106 j
11 VT 43 + 75 K 107 k
12 FF 44 , 76 L 108 l
13 CR 45 - 77 M 109 m
14 SO 46 . 78 N 110 n
15 SI 47 / 79 O 111 o
16 DLE 48 0 80 P 112 p
17 DC1 49 1 81 Q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 DC4 52 4 84 T 116 t
21 NAK 53 5 85 U 117 u
22 SYN 54 6 86 V 118 v
23 ETB 55 7 87 W 119 w
24 CAN 56 8 88 X 120 x
25 EM 57 9 89 Y 121 y
26 SUB 58 : 90 Z 122 z
27 ESC 59 ; 91 [ 123 {
28 FS 60 < 92 \ 124 |
29 GS 61 = 93 ] 125 }
30 RS 62 > 94 ^ 126 ~
31 US 63 ? 95 _ 127 

Questa è la versione sintetica della tabella precedente, con i soli caratteri ASCII di base stampabili:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Di fatto il set di caratteri ASCII di base riflette il modo in cui i caratteri sono scritti su (e possono essere riletti da) un foglio di carta scritto con una macchina da scrivere, impiegando un set di caratteri/codice universalmente riconosciuto. Non solo: della macchina da scrivere il codice ASCII conserva, ad esempio, il comando LF (Line Feed) che fa avanzare il foglio alla riga successiva, e il comando CR (Carriage Return) che riporta il carrello della macchina da scrivere (virtuale) all'inizio della riga. Anche se la macchina da scrivere è stato oramai da decenni sostituita da PC, word processor e stampante, è da questa che sono derivati i concetti e questo standard minimo di base.

Gli altri set di caratteri che vediamo ora hanno progressivamente esteso il set di caratteri ASCII di base con set di caratteri aggiuntivi, con l'obiettivo di includere tutti i caratteri di tutte le lingue (cosa inimmaginabile via hardware, con un dispositivo meccanico come la macchina da scrivere, ma senza sostanziali problemi via software).

Il primo nato allo scopo di estendere il set di caratteri ASCII di base è stato il set di caratteri ANSI (acronimo di American National Standard Institute) nel quale i caratteri sono codificati con 8 bit cosa che permette di codificare 28 = 256 caratteri numerati da 0 a 255. Il set di caratteri ANSI include il set di caratteri ASCII di base (caratteri numerati da 0 a 127) più il set di caratteri denominato ASCII esteso (caratteri numerati da 128 a 255). Purtroppo per i caratteri da 128 a 255 non si è stabilito subito un accordo e questo ha determinato la presenza di differenze tra il set di caratteri a 8 bit Windows 1252 (che viene denominato impropriamente ANSI e che è ampiamente utilizzato) e il set di caratteri ISO-8859-1 anch'esso a 8 bit (i due infatti codificano in modo differente i caratteri da 128 a 159).

Dato il numero elevato di caratteri da codificare (si pensi ad esempio al cirillico, al greco, all'aramaico, all'ebraico e al numero di ideogrammi necessari per codificare i testi in Cinese, Giapponese e Coreano) e data la vitale importanza di una codifica univoca dei caratteri, è nato quindi Unicode, un consorzio no-profit privato al quale partecipano tutte le principali aziende di informatica, con lo scopo di assegnare ad ogni carattere impiegato per la scrittura un numero univoco indipendente dalla lingua, dalla piattaforma informatica e dal software impiegati [3].

Gli standard Unicode sono identificati dalla sigla UTF (Unicode Transformation Format) seguita da un numero progressivo di versione. Dal 1991 il Consorzio Unicode ha sviluppato gli standard in parallelo con la norma ISO/IEC 10646 che definisce l'Universal Coded Character Set (UCS). Entrambi hanno lo stesso repertorio di caratteri, con gli stessi numeri: fortunatamente, e saggiamente, Unicode e ISO hanno deciso di normare congiuntamente in modo identico questo aspetto di base e così delicato della comunicazione.

Di fatto Unicode è oggi il riferimento ufficiale - per definizione in linea con la normativa ISO - per la codifica standard dei caratteri, che include gli storici set di caratteri
→ codice ASCII di base - Basic Latin [4]
→ codice ASCII esteso - Latin-1 Supplement [5]
accanto agli altri numerosissimi set di caratteri che nel frattempo sono stati sviluppati, e continuano ad essere aggiornati, per coprire tutte le lingue del mondo [6] .

Attualmente il più estesamente impiegato è lo standard UTF-8: alla data di pubblicazione di questo post la maggior parte delle pagine web sono realizzate impiegando la codifica dei caratteri prevista da questo standard.


----------

[1] In inglese si pronuncia æski (æ come in fat, s come in sorry, k come in car, i come in happy), ma in italiano viene pronunciato aschi o anche asci.

[2] ISO/IEC 646. URL consultato il 29/09/2023: https://goo.gl/hAuERi

[3] The Unicode Consortium. URL consultato il 29/09/2023: https://home.unicode.org/

[4] C0 Controls and Basic Latin. URL consultato il 29/09/2023: https://goo.gl/GJHqfW

[5] C1 Controls and Latin-1 Supplement. URL consultato il 29/09/2023: https://goo.gl/cfhgLd

[6] Unicode Character Code Charts. URL consultato il 29/09/2023: https://goo.gl/rsFsgv

Nessun commento:

Posta un commento