Corso di C con Linux

Codifica dei caratteri

 

Continuiamo il nostro viaggio all’interno del calcolatore, esaminando il modo in cui vengono codificati i caratteri.
Normalmente i caratteri sono rappresentati come stringhe di 7 bit mediante una codifica chiamata ASCII  (acronimo di American Standard Code for Information Interchange).
Sulle macchine moderne, ciascuno dei 128 caratteri ASCII è dato dai 7 bit meno significativi di un ottetto.
Gli ottetti sono riuniti in parole (word) di memoria, la cui dimensione dipende dall’architettura usata; ad es. con word da 32 bit una stringa di 6 caratteri occupa solamente 2 parole di memoria.
Per visualizzare la mappa dei caratteri ASCII, provate a scrivere al prompt di Linux il comando:

man 7 ascii

Osserviamo che abbiamo utilizzato il termine ‘ottetto’, che è formalmente corretto ma raramente utilizzato: la maggior parte delle persone si riferisce a un ottetto come ad un byte e ritiene che i byte siano lunghi 8 bit.
Per essere corretti, il termine ‘byte’ è più generale; ad es. in passato ci sono state macchine a 36 bit con byte di 9 bit, anche se probabilmente ciò non capiterà più in futuro.
Purtroppo non tutto il mondo usa i codici ASCII, a causa del fatto che non contiene molti caratteri accentati e alcuni caratteri speciali necessari per molte lingue.

Diversi sono stati i tentativi di risolvere questo problema.
Attualmente tutti fanno uso dell'ottavo bit non usato dai codici ASCII (il più significativo), cosicché l’intero set di caratteri rappresentabili è esteso a 256, di cui la prima metà (da 0 a 127) è costituita dai codici ASCII originari.
Quello più largamente utilizzato è il set di caratteri ‘Latin-1’ (o più formalmente ISO 8859-1), che è il set di caratteri predefinito per Linux, HTML e X.
Per visualizzare la mappa dei caratteri Latin-1, potete riferirvi alla corrispondente pagina del manuale Linux scrivendo al prompt il comando:

man 7 iso_8859_1

Microsoft Windows usa una versione mutante di Latin-1, che aggiunge alcuni caratteri come le virgolette destre e sinistre, in posizioni lasciate libere da Latin-1 per ragioni storiche (per una resoconto severo dei problemi che ciò ha provocato, vedere la pagina cliccando qui).
Latin-1 gestisce le principali lingue europee, tra cui inglese, francese, tedesco, spagnolo, italiano, olandese, norvegese, svedese e danese.
Tuttavia non è ancora sufficiente, per cui esistono altre serie di set di caratteri da Latin-2 a Latin-9, per rappresentare il greco, l'arabo, l'ebraico e il serbo-croato (chi è interessato può trovare maggiori dettagli alla pagina ISO alphabet soup ).

La soluzione definitiva è uno standard (enorme) a 16 bit chiamato Unicode, che è identico a Latin-1 nelle 256 posizioni più basse, mentre nello spazio successivo comprende caratteri per le lingue greco, cirillico, armeno, ebraico, arabo, devanagarico, bengalese, gurmukhi, gujarati, oriya, tamil, telugu, kannada, malese, tailandese, lao, georgiano, tibetano, giapponese kana e il set completo del coreano hangul moderno e un set unificato di ideogrammi cinesi/giapponesi/coreani (CJK).
Per maggiori dettagli vedere la Unicode Home Page .

Detto questo dobbiamo cominciare a vedere come ci possano essere utili tutte queste informazioni in un programma C.
Sappiamo che il nostro calcolatore memorizza i dati al suo interno mediante opportune sequenze di bit, ma noi vogliamo poter lavorare con i dati senza dover conoscere la numerazione binaria e la corrispondenza tra i codici binari e il loro significato.
Ad es. vogliamo vedere a video il carattere ‘A’ piuttosto che la sua codifica ASCII (01000001), in quanto quest’ultima ci risulta piuttosto difficile e sicuramente non immediata.
Fortunatamente il C non ci costringe a sforzi mnemonici inutili e ci aiuta a lavorare in maniera più semplice, fornendoci degli strumenti opportuni.
A partire dalla prossima lezione vedremo in che modo il C tratta i nostri dati.

 

Torna all'indice Generale del corso di Corso di C con Linux di Software Planet