Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate
La rappresentazione di testi:
caratteri e stringhe
Rappresentiamo lettere, parole, testi:
caratteri e stringhe
Ora sappiamo come codificare numeri (naturali, interi, razionali) Anche le informazioni “alfabetiche” vanno codificate!
Idea base:
facciamo corrispondere ogni carattere(lettere) ad un numero (in modo arbitrario… purché standard)
(cioè deciso una volta per tutte!) per es: 1 <==> A, 2 <==> B ….
una parola, o un testo, è solo una sequenza di caratteri (una stringa) memorizzata come sequenza di numeri (naturali!)
(compreso un carattere «spazio» per staccare le parole e un carattere «accapo» per staccare le righe)
Problemi apparentemente banali:
quali caratteri? quanti caratteri?
quale corrispondenza caratteri numeri?
Aritmetica binaria
Architettura degli elaboratori - 113 -
I caratteri
Il carattere è l’elemento base delle lingue umane.
Ci serve per far sì che la comunicazione tra macchina e utente sia semplice.
Problema: in alfabeti diversi i caratteri hanno particolarità diverse:
Negli alfabeti di derivazione greca (greco, latino e cirillico), esiste la distinzione tra maiuscole e minuscole, ignota altrove
Negli alfabeti di derivazione latina si sono inventati segni particolari sulle lettere, come ad es. gli accenti.
In ebraico, le vocali sono modificatori di lettere di consonanti In arabo, la giustapposizione di lettere diverse nella parola provoca una differenziazione della forma delle lettere stesse.
In cinese, è possibile creare nuovi caratteri come composizione di altri caratteri esistenti.
In alcune lingue si legge da destra a sinistra, in altre viceversa In ciascuna lingua, esistono diversi stili di scrittura dei caratteri:
es corsivo, anzi tanti corsivi diversi, o italico etc
La codifica dei caratteri
Per il momento ci concentriamo sui caratteri base degli alfabeti occidentali, che, per motivi storici, sono stati i primi a essere codificati.
Per gli usi più comuni, i caratteri usati sono relativamente pochi 10 cifre numeriche 0,1,2,3,4,5,6,7,8,9
26 minuscole: a,b,c, … 26 maiuscole: A,B,C, …
6 simboli di interpunzione ( . , ? ! ; : )
pochissimi operatori matematici di uso comune ( + - < > ) apostrofi, accenti, virgolette (‘ “ `)
un’altra manciatina di simboli uso comune (° @ # $ | / \ _ * ) In totale: meno di 100 caratteri:
7 bit (128 combinazioni) ci bastano per rappresentarli tutti.
Nota: per i numeri esiste una codifica “naturale” (ad es. lo zero è rappresentato da un insieme di bit nulli) per i caratteri possiamo usare ad esempio l’ordine alfabetico.
Aritmetica binaria
Architettura degli elaboratori - 115 -
La codifica dei caratteri: ASCII
Con 7 bit, rappresento 128 caratteri diversi
Basta fissare una corrispondenza fissa tra numeri appartenenti all’intervallo 0-255 e i caratteri.
La cosa importante è che questa corrispondenza sia nota ed accettata da tutti (pena la scorretta interpretazione dei testi).
la codifica dei caratteri deve essere stabilita da uno standard.
Lo standard più adottato è lo standard ASCII
(persino prima dei computer! telescriventi, telegrafi…)
ASCII: American Standard Code for Information Interchange (si pronucia «àschii», ma in Ita a volte anche «àscii»)
0 1 2 3 4 5 6 7
0 SPC 0 @ P ' p
1 ! 1 A Q a q
2 " 2 B R b r
3 # 3 C S c s
4 EOT $ 4 D T d t
5 % 5 E U e u
6 & 6 F V f v
7 ' 7 G W g w
8 BSP ( 8 H X h x
9 ) 9 I Y i y
A LF * : J Z j z
B * ; K [ k {
C FF , < L \ l |
D CR - = M ] m }
E . > M ^ n ~
F / ? O _ o del
La tabella ASCII
ASCII - note
Adozione praticamente universale da parte dei computer da decenni Uso universale in informatica!
perché per la mail si usa il simbolo @?
perché per gli hashtag si usa #?
perché in molti linguaggi di programmazione:
* si usano parentesi ( ), [ ], { } ?
* si usa $e& (con i più vari significati)?
* la divisione si fa con /(e non, mettiamo, con ÷)?
* la moltiplicazione si fa con *(e non, mettiamo, con ×)?
* il minore-o-uguale si dice <= (e non, mettiamo, ≤)?
* le virgolette sono aperte e chiuse con "(e non, mettiamo, «e »)
* per la radice quadrata si usa sqrt, e non √
perché nei path dei file o negli URL dei siti web si usano / e\ perché in HTML nei tag si aprono con < e chiudono con>
perché in molti URL appare il simbolo ~ (per indicare homepage) risposta: perché tutta l’informatica di base usa il codice ASCII
Aritmetica binaria
Architettura degli elaboratori - 117 -
Il codice ASCII ha anche
Lo spazio (il carattere spazio)
Purtroppo, una trentina di caratteri di controllo «non stampabili»
per lo più per motivi storici (telescriventi, telegrafi…)
es, «suona un campanello», «fine conversazione», «cancella l’ultimo carattere»…
ce li portiamo dietro solo per motivi storici
consumano spazio di rappresentazione (lasciano meno codici per i caratteri veri)
l’unico di questi che ci serve davvero è il carattere «accapo»
e il carattere «zero»
(usato spesso per significare la fine di una stringa)
Aritmetica binaria
Architettura degli elaboratori - 119 -
I caratteri ASCII “di controllo”
Per gestire un testo non servono solo i caratteri visibili, ma ci vogliono anche un certo numero di caratteri “di controllo”.
Ad es. per segnalare la fine di una riga sono disponibili CR (carriage return) e LF (line feed)
Fanno riferimento ad un dispositivo di output del tipo della telescrivente.
EOT (end of text) indica la sine del testo
Del indica la cancellazione di un carattere precedentemente inserito
Tutti questi caratteri non sono visualizzati, hanno invece un effetto sul testo.
Il codice ASCII non ha :_(
Lettere accentate
Simboli matematici, eccetto pochissimi basilari (+, -, <, >) Lettere greche
(neanche quelle di uso comune, come pi-greco o epsilon) Anzi… nessun alfabeto che non sia quello latino di base!
no: cirilloco, giapponese, coreano…
Simboli per monete che non siano il dollaro
Interpunzioni rovesciate (quelle per es. usate in spagna) Emoticon
ASCII è (a malapena) sufficiente solo per i testi più basici e i testi scritti in linguaggi formali!
ASCII esteso
Osservazione: un byte sono 8 bits,
ma la codifica di un carattere ASCII ne richiede solo 7 !
Idea nefasta, ma percorsa molte volte nella storia dell’informatica:
Utilizziare l’ottavo bit, ed estendere la tabella ASCII con 128 nuove combinazioni
Ottenere cosi’ 128 nuovi caratteri (numerati da 128 a 255)!
Bene, ma aroblema: QUALI CARATTERI INTRODURRE?
Come abbiamo visto, il codice ASCII è deficitario di moltissime cose Parti diverse del mondo necessitano di caratteri diversi
128 non bastano certo per tutti
Risultato: estensioni diverse su macchine diverse (di paesi diversi) Es: in europa: molto popolare ISO-Latin1, con i vari ò,à,è,é…
Es: in russia: CP-866 che introduce i vari ц, ч, ш, ъ, ы, ….
Molti standard in conflitto = molti problemi
Aritmetica binaria
Architettura degli elaboratori - 121 -
Esempio:
ISO 8859/1 (ISO Latin-1)
L’ISO Latin-1 – ancora molto utilizzato in pagine WEB, ma in declino
Oltre ai caratteri ASCII, ISO Latin-1 contiene vari caratteri accentati e lettere usate dai linguaggi dell’Europa occidentale (Italiano, Francese, Spagnolo, Tedesco, Danese, ecc.): ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ ·
¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
L’ISO Latin-1 è compatibile con l’ASCII nel senso che i primi 128 codici hanno identico significato nei due standard.
(questo vale per tutti gli altri codici ASCII estesi – a volte, ridefiniscono anche molti dei caratteri speciali cioè «non stampabili»)
Aritmetica binaria
Architettura degli elaboratori - 123 -
Codifica dei caratteri nei computer oggi
Codice ASCII:
conveniente perché un solo byte per carattere (MSB a 0)
utilizzato per costrutti base di linguaggi formali, file system, o testi molto basici
es stringhe native in C
Codici ASCII estesi, es ISO Latin-1
ancora un solo byte per carattere, ma spesso problemi di interpretazione e localizzazione
ancora utilizzato in alcune pagine web, ma in forte diminuizione
Per tutto il resto, c’e’ UNICODE
(Esistono altri standard ma sono meno utilizzati e in diminuzione)
Unicode
Risolviamo una volta per tutte il problema del mapping fra numeri e caratteri
Unicode è uno standard universale gestito da un apposito consorzio inernazionale
Ad ogni numero naturale si fa corrispondere un carattere In evoluzione. Es:
nel 1991 (ver. 1.0.1) viene aggiunto Hiragana, Greco, Copto…
nel 1998 (ver 2.0) viene aggiunto il simbolo dell’euro nel 2009 (ver 5.2) vengono aggiunti i geroglifici egizi nel 2014 (ver 8.0) vengono aggiunti il Siddhaṃ ( ) Attualmente, dopo una trentina di revisioni, sono previsti
> 136,000 caratteri di tutte le lingue del mondo vive e morte (e, simboli matematici, fisici, chimici… e tutti i kanji
cinesi/giapponesi/coreani, ed emoticons… e pezzi degli scacchi… e simboli segni zodiacali… in breve, tutto quello che si può scrivere)
Unicode: note
In UNICODE, i primi 128 caratteri (da 0 a 127) coincidono con la tabella ASCII
l’UNICODE estende l’ASCII
Adozione universale:
Unicode è oggi utilizzato nella stragrande maggioranza dei testi, degli url, dei filename nei file system…
Aritmetica binaria
Architettura degli elaboratori - 125 -
Unicode e UTF
L’unicode si occupa solo di quale numero corrisponda a quale carattere.
concettualmente semplice!
Non si occupa affatto di come codificare in binario i numeri che rappresentano questi caratteri.
Dunque, come rappresentiamo un carattere UNICODE?
cioè un numero naturale da 0 a (per ora) 136,755
I diversi modi per rispondere a questa domanda sono detti UTF (Unicode Transformation Format)
Considerazione:
per le > 133.000 combinazioni servono almeno 17 bits risposta 1: usiamo un intero senza segno a 32 bit (UTF-32).
semplice e completo, ma molto oneroso: ben 4 bytes per carattere risposta 2: usiamo un intero senza segno a 16 bit (UTF-16)
semplice, e solo 2 bytes per carattere, ma rinunciamo ad esprimere circa metà dei caratteri UNICODE possibili (quanti?)
Unicode e UTF-8
Risposta 3: (UTF-8)
utilizziamo un byte per i primi 128 caratteri (0xxxxxxx) se il carattere codificato è > 127, il bytes comincia con un 1, allora usiamo un numero variabile di bytes addizionali (1,2 o 3) (…secondo alcune regole specificate, di cui non ci occupiamo) risultato:
maggiore è il numero, più raro il carattere,
e maggiore il numero di byte necessario per codificarlo (bene!) esempio:
per un carattere ASCII, es la lettera t: 1 byte per una lettera greca: 2 bytes.
per uno delle migliaia di kanji (ideogrammi cinesi): 3 bytes.
per un geroglifico egizio: 4 bytes ) UTF-8 è quindi molto conveniente.
inoltre, un testo in ASCII è ANCHE un testo in UTF-8 (perché?) UTF-8 è il più utilizzato formato attuale per i testi! (es in rete)
Aritmetica binaria
Architettura degli elaboratori - 127 -
Unicode e fonts
L’unicode si occupa solo
di quale numero corrisponda a quale carattere, in astratto.
Non si occupa di come i caratteri vadano resi a schermo (o in stampa) Di questo si occupa il font
Un font = la descrizione di un modo di disegnare ciascuno dei (oppure, quasi sempre, un sottoinsieme dei)
caratteri UNICODE
(praticamente nessun font prescrive l’aspetto di ciascuno dei caratteri UNICODE – I caratteri non previsti vengono resi con � ) nota: font diversi possono prevedere forme molto diverse per uno stesso carattere UNICODE
per es: confronta
4
(Font: arial) e (Font: garamon) in questo corso non ci occupiamo di come rappresentare i fontsAritmetica binaria
Architettura degli elaboratori - 129 -
Interpretazione delle informazioni
In un byte della memoria c’è la configurazione 01000001.
Come fa il calcolatore a sapere se questo byte va interpretato come un numero intero (65) o come un carattere (A)?
La risposta è semplice: non lo sa per niente.
Sono i nostri programmi che devono ricordarsi qual è il significato di una data cella di memoria (o variabile).
Molti linguaggi facilitano questo compito assegnando un “tipo” alle variabili, per cui su una variabile di tipo carattere non si possono fare somme.
Altri linguaggi come gli assembler non danno questo tipo di protezione
Una scomoda ambiguità
«Endedness»!
0A0B0C0D
0D 0C 0B 0A
integer a 32 bit
a:
a+1:
a+2:
a+3:
……
Memoria
Little-endian
0A0B0C0D
0A 0B 0C 0D
integer a 32 bit
a:
a+1:
a+2:
a+3:
……
Memoria
Big-endian
Overflow…
Aritmetica binaria
Architettura degli elaboratori - 131 -