20 novembre 2018

Codifica dei caratteri ASCII, ANSI, Unicode (UTF)

ASCII – che 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 – è 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 originario è stato definito nella norma ISO/IEC 646 - Information technology - ISO 7-bit coded character set for information interchange [1]. 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 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 originario 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 

Questi sono i caratteri stampabili del set di caratteri ASCII di base:

!"#$%&'()*+,-./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 (1 byte) cosa che permette di codificare 28 = 256 caratteri numerati da 0 a 255. Il set di caratteri ANSI prevedeva due sottoinsiemi:
→ il set di caratteri ASCII di base (caratteri numerati da 0 a 127) visto sopra;
→ il set di caratteri ASCII esteso (caratteri numerati da 128 a 255). 

Purtroppo per i caratteri da 128 a 255 del set di caratteri ASCII esteso non si è stabilito subito un accordo e questo ha determinato la nascita di differenze tra il successivo set internazionale di caratteri ISO-8859-1  che ha incluso ASCII di base e ASCII esteso  e il set di caratteri a 8 bit Windows 1252 che nel corso dello sviluppo delle prime versioni di Windows si è andato differenziando dal precedente per i caratteri che vanno da 128 a 159

Conseguentemente si ha che nel set internazionale ISO-8859-1 e nel set Windows 1252:
1) i caratteri che vanno da 0 a 127 (ASCII di base visti sopra) sono identici;  
2) i caratteri da 128 a 159 nel set internazionale ISO-8859-1 non sono codificati per evitare conflitti, mentre nel set Windows 1252 sono codificati come segue

€¹‚ƒ„…†‡ˆ‰Š‹Œ¹Ž¹¹‘’“”•–—˜ ™š›œ¹žŸ

(¹ indica i cinque caratteri non codificati) e così rimarranno fino a quando Microsoft vorrà mantenere la compatibilità del suo set di caratteri (che viene denominato impropriamente ANSIcon le vecchie versioni di Windows;
3) i caratteri che vanno da 160 a 255 sono identici e sono codificati come segue

NBSP ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ SHY ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

Stante questo iniziale incidente di percorso, stante la vitale importanza di una codifica univoca dei caratteri e stante 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) è 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 identificativo univoco indipendente dalla lingua, dalla piattaforma informatica e dal software impiegato [2].

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 la codifica dei caratteri – per definizione in linea con le norme ISO –  e comprende:
→ i caratteri ASCII di base – ora inclusi nel set Basic Latin [3]
→ i caratteri ASCII esteso – ora inclusi nel set Latin-1 Supplement [4]
→ i caratteri (a fine 2025 poco meno di 160 000) che in aggiunta ai precedenti sono stati sviluppati per coprire tutte le lingue del mondo [5].

Attualmente il più estesamente impiegato è lo standard UTF-8: la stragrande maggioranza delle pagine web sono realizzate impiegando questo standard. Le varie versioni del The Unicode® Standard si possono trovare sul sito del consorzio [6].


----------

[1] ISO/IEC 646.
https://en.wikipedia.org/wiki/ISO/IEC_646

[2] The Unicode Consortium.
https://home.unicode.org/

[3] C0 Controls and Basic Latin.
https://www.unicode.org/charts/PDF/U0000.pdf

[4] C1 Controls and Latin-1 Supplement.
https://www.unicode.org/charts/PDF/U0080.pdf

[5] Unicode Character Code Charts.
https://www.unicode.org/charts/

[6] Enumerated Versions of The Unicode® Standard.
https://www.unicode.org/versions/enumeratedversions.html

Nessun commento:

Posta un commento