• Non ci sono risultati.

Marco Tarini -Università dell'InsubriaA.A. 2017/18Architettura degli elaboratori -Rappresentazione dell'informazione nei calcolatori -41Università degli Studi dell’InsubriaDipartimento di Scienze Teoriche e ApplicateLa rappresentazione di testi:caratteri

N/A
N/A
Protected

Academic year: 2021

Condividi "Marco Tarini -Università dell'InsubriaA.A. 2017/18Architettura degli elaboratori -Rappresentazione dell'informazione nei calcolatori -41Università degli Studi dell’InsubriaDipartimento di Scienze Teoriche e ApplicateLa rappresentazione di testi:caratteri "

Copied!
11
0
0

Testo completo

(1)

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?

(2)

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.

(3)

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

(4)

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)

(5)

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!

(6)

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»)

(7)

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)

(8)

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?)

(9)

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 fonts

(10)

Aritmetica 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

(11)

Overflow…

Aritmetica binaria

Architettura degli elaboratori - 131 -

https://xkcd.com/571/

Riferimenti

Documenti correlati

Per esempio 1237 è rappresentato come sequenza di 4 byte: un primo byte che contiene la codifica ASCII della cifra 1 (00110001), un secondo byte che contiene la codifica ASCII

[r]

Dati due numeri naturali rappresentati su un solo bit, e il riporto della somma precedente, il circuito ne calcola la somma (compreso il

Registro parallelo con comandi di ripristino (Reset) e precarica (Preset) Preset = mettere ad 1 il contenuto in modo asincrono. Registro parallelo universale, riunisce le funzioni

Il programma deve riempire un secondo array, memorizzato alla locazione “dest” (destinazione), che contenga tutti gli elementi strettamente positivi del primo array,

Per il momento ci concentriamo sui caratteri base degli alfabeti occidentali, che, per motivi storici, sono stati i primi a essere codificati.. Prima osservazione: i caratteri

La carta è l’esito di: (i) una selezione delle informazioni tematiche e topografiche disponibili nelle banche dati del Sistema Territoriale e Ambientale della Regione

¨  Nell’input di stringhe, la scanf scarta automaticamente i white space iniziali e continua a leggere fino a quando incontra un white space (quindi non si può usare la scanf