Rappresentazione Caratteri PDF
Document Details
Uploaded by NoteworthyXenon4035
Sapienza Università di Roma
Domenico Lembo, Paolo Liberatore, Giuseppe Santucci, Alberto Marchetti Spaccamela, Marco Schaerf
Tags
Summary
These notes cover character representation, strings, and other data in computer science. The document details ASCII encoding and the limitations of character representation. It also covers the ISO-IEC 8859 standard and concepts like character sets and Unicode representation. The notes are likely part of a course on informatica at Sapienza Università di Roma.
Full Transcript
Rappresentazione di caratteri, stringhe e altri dati Fondamenti di Informatica I Corso di laurea in Ingegneria Informatica e Automatica Sapienza Università di Roma Domenico Lembo, Paolo Liberatore, Giuseppe Santucci, Alberto Marchetti Spaccamela, Marco Schaerf...
Rappresentazione di caratteri, stringhe e altri dati Fondamenti di Informatica I Corso di laurea in Ingegneria Informatica e Automatica Sapienza Università di Roma Domenico Lembo, Paolo Liberatore, Giuseppe Santucci, Alberto Marchetti Spaccamela, Marco Schaerf Rappresentazione di caratteri Il calcolatore è in grado di manipolare solo due simboli elementari che noi codifichiamo normalmente in “0” e “1” Tutte le informazioni possono essere rappresentate con sequenze di “0” e “1” La dimensione minima di una cella di memoria è 8 bit, 28= 256 possibili configurazioni di “0” e “1” Siamo quindi interessati a capire come possiamo realizzare tali rappresentazioni. Partiamo dalla rappresentazione dei caratteri: – ogni carattere si rappresenta con un numero (codificato in binario) – versioni più semplici: un numero a otto bit, ovvero un byte – versione moderna più utilizzata (anche da Python): da 8 a 32 bit, ovvero da 1 a 4 byte 1 Codifica ASCII ASCII: American Standard Code for Information Interchange pubblicato dall'American National Standards Institute (ANSI) nel 1968. È un sistema di codifica a 7 bit. Questo consente di utilizzare 27=128 numeri (da 0 a 127) per codificare altrettanti caratteri. Esempi: 'z' → 1111010 (numero 122 - espresso in binario con 7 bit) ';' → 0111011 (numero 59) 'E' → 1000101 (numero 69) '0' → 0110000 (numero 48) Invece di 7 bit è possibile (e necessario) usarne 8, ponendo il primo bit pari a 0 (quindi, ad esempio, la codifica di ‘z’ diventa 01111010, che rappresenta sempre il numero 122 espresso in binario con 8 bit – (la rappresentazione binaria dei numeri naturali sarà oggetto di una lezione successiva) 2 Caratteri speciali alcuni numeri (da 0 a 31, e il 127) non rappresentano veri caratteri, ma simboli speciali (non stampabili), comunemente detti caratteri di controllo Ad esempio 0 (chiamato NUL) indica la fine di una stringa 7 (chiamato BEL) indica un beep, inteso come suono (bell, campanello)! 9 (chiamato TAB) indica una tabulazione orizzontale 10 (chiamato LF, e cioè Line Feed) indica l’andata a capo (sulle vecchie stampanti a rullo faceva avanzare la carta di una riga) indicato con \n (si usa esplicitamente in Python) 13 (chiamato CR, e cioè Carriage Return) indica lo spostamento del cursore all’inizio della linea 19 (chiamato DC3, dove DC sta per Device Control) indica la richiesta sospensione trasmissione 17 (chiamato DC1) indica richiesta ripresa trasmissione 3 La tabella ASCII Caratteri speciali Caratteri stampabili 4 Limiti della codifica ASCII La codifica ASCII cattura solo un limitato di caratteri. Ad esempio, mancano le lettere accentate italiane (à, è, é, ì, ò, ù), o la ñ spagnola, i caratteri tedeschi ä, ö, ü, ß Ovviamente mancano molti altri simboli, come gli ideogrammi o i simboli matematici e chimici, o anche un simbolo di uso molto comune come il simbolo dell’euro Sono quindi state proposte altre codifiche per ampliare l’uso dei caratteri rappresentabili Nel seguito ci concentriamo in particolare sulle codifiche ISO-8859-1 e Unicode UTF-8 5 ISO-IEC 8859 Estende i codici ASCII a 8 bit ponendo il primo bit a 1 Estensione non univoca: le 128 codifiche dipendono del code page selezionato e impostato nel sistema operativo 15 diversi codici nazionali (code page) ISO-IEC 8859-x – Erano 16, il 12 è morto.... (Celtico, ora 14) A noi interessa ISO-IEC 8859-1 Latin-1 West European che codifica i caratteri usati nella maggior parte delle lingue europee occidentali, incluse l’italiano, lo spagnolo e il tedesco. È probabilmente la parte di ISO-8859 più usata. Impossibile usarli simultaneamente: la confusione nasce quando un carattere è interpretato in un codice nazionale diverso da quello nel quale era stato scritto (l'informazione non è nel byte!) Problema tipico: caratteri strani nelle e-mail e nelle pagine web ISO-IEC 8859: la torre di Babele 12 caratteri nelle 15 diverse codifiche di ISO/IEC 8859 Limiti della codifica ISO-8859-1 Questo sistema va bene per lingue come l'italiano, l'inglese, lo spagnolo, il norvegese, ma copre solo in parte i simboli usati in altre lingue (ad es. lingue dell’est europa, il russo, l’arabo, il turco, ecc.) Per queste bisogna ricorrere ad altri standard code page Per esempio, il code page ISO-8859-9 consente di codificare tutti i caratteri usati nella lingua turca, e usa il numero 253 per la i senza punto ı invece che per la y con accento acuto ý come in ISO-8859-1 Quindi, le varie ISO-8859-x sono incompatibili fra loro e bisogna sempre specificare quale ISO-8859-x si sta usando Non si possono scrivere testi in più lingue insieme alcune lingue, come il cinese, hanno più di 256 caratteri 8 Unicode Unicode (anche detto Universal Coded Character Set, o UCS) è un sistema di codifica in grado di rappresentare i caratteri usati in quasi tutte le lingue vive e in alcune lingue morte, simboli matematici e chimici, cartografici, l'alfabeto Braille, ideogrammi ecc. E’ in realtà un enorme dizionario di caratteri Nella formulazione iniziale usava due byte (non si impara mai dal passato...) codificando 65.536 caratteri; ora prevede 17 (00..10 in esadecimale) insiemi di codifiche da 65.536 , ovvero 17*65.536=1.114.112 possibili codifiche, rappresentabili con 21 bit (solo 393216 assegnate) Per rappresentare in modo efficiente i caratteri, Unicode prevede tre possibili codifiche – UTF-8, sequenza fino a 4 unità da 8 bit – UTF-16, sequenza fino a 2 unità da 16 bit (è una evoluzione del precedente UCS-2, codifica di lunghezza fissa a 2 byte) – UTF-32 (nota anche come UCS-4), sequenza di esattamente 32 bit per carattere Delle tre, UTF-8 è la più efficiente nel gestire lo spazio, consentendo anche di usare una sola unità da 8 bit (cioè un byte) per rappresentare un carattere (i 127 caratteri ASCII) 9 UTF-8: schema di codifica 0 127 128 2047 2048 65535 65536 1114111 5 bit 16 bit i primi 128 caratteri, che sono gli stessi di ASCII, otto bit, il cui primo bit è 0 altri caratteri: sequenza di numerali a otto bit che hanno sempre 1 come primo bit; il primo di questi numeri è nella forma 1...10..., e la quantità di 1 indica la lunghezza in byte della sequenza I bit effettivamente usati per la codifica sono indicati in figura con d (vedi colonna Bits) Chi interpreta il codice, guardando i primi bit del primo byte può sempre stabilire il numero di byte usati per quel particolare carattere Il primo byte non comincia mai per 10: questo permette di rifasarsi in caso di errori di trasmissione Potenzialmente, UTF-8 potrebbe usare sequenze fino a 6 byte con 31 bit (2.147.483.648 code points), ma nel 2003 è stato limitato a 4 byte per coprire solo l'intervallo descritto formalmente nello standard Unicode, per il quale 21 bit sono sufficienti (massimo numero rappresentabile 1.114.111 = 10FFFF in esadecimale). Python usa UTF-8 La funzione chr (intero) restituisce il carattere corrispondente all'intero La funzione ord (carattere) restituisce il codice UTF-8 corrispondente al carattere 11 Stringhe Le stringhe sono sequenze di caratteri Ad esempio 'ciao a tutti! ' è una stringa che in Python possiamo stampare con il comando print('ciao a tutti!') sequenza fra virgolette = stringa = sequenza di caratteri Ogni carattere è un numero. I numeri corrispondenti ai caratteri vengono memorizzati in sequenza. La stringa precedente è così rappresentata 99 105 97 111 32 97 32 116 117 116 116 105 33 0 99 = c, 105 = i, 97 = a, … 32 = spazio 0 = fine stringa 12 Rappresentazione delle cifre '0'.. '9' In ASCII, ISO-8859-1, UTF-8 le cifre ‘0’..’9’ sono rappresentate con i numeri 48..57. Quindi nell’esempio precedente lo 0 non corrisponde alla cifra ‘0’, ma è il terminatore di stringa Esempio: stringa ‘da 0 a 5’ 13 Ritorno a capo Il ritorno a capo viene indicato con – Il numero 10 (cioè \n Line Feed) (Unix), oppure – con il numero 13 (cioè \r Carriage Return) (Mac Os fino alla versione 9) – con la sequenza 13 10 (windows, DOS) C’è un motivo storico per questo, legato all’uso delle prime stampanti: 10 = avanzamento carta di una linea 13 = ritorno del carrello a inizio linea 14 Suoni Sono onde di pressione dell'aria È possibile fornirne una rappresentazione numerica: – Pressione misurata a intervalli regolari (es. 48000 volte al secondo) – Ciascun valore rappresentato in binario (es. a 16 bit) – Suono = sequenza di questi valori La sequenza è uguale all’originale (campionando a una frequenza pari al doppio di quella massima) – variazioni fra una misurazione all'altra non vengono rilevate – la pressione è un valore continuo numero prefissato di bit = approssimazione fedeltà all'originale = alta frequenza di campionamento + alto numero di bit 15 Colori e Immagini La maggior parte dei colori visibili all'occhio umano si possono considerare un miscuglio di quantità variabili di rosso, verde e blu (RGB) Esempio: massimo di rosso, mezzo verde e niente blu Immagine raster = griglia di minuscoli quadrettini (pixel) – ogni pixel viene considerata di un colore solo – per ogni pixel, si rappresentano le quantità di rosso, verde e blu che contiene 16 Rappresentazione delle immagini Un semplice formato (ppm) parte iniziale identificativo del formato (P3) larghezza e altezza dell'immagine (3×3) – 9 pixel in tutto massima intensità di colore (100) matrice i colori dei pixel, in sequenza (es. 0 100 0 = niente rosso, max verde, niente blu) Immagini rappresentate come quadrati di pixel si dicono raster. Approssimazioni e compressioni Come per i suoni, si tratta comunque di una rappresentazione approssimata, per i soliti due motivi: ogni pixel viene considerato di un colore unico (quindi variazioni di colore più piccole di un pixel vengono ignorate), e i colori vengono rappresentati con un numero finito di bit (per cui esiste una perdita di precisione). Esistono meccanismi di compressione, che permettono di ridurre lo spazio di memoria richiesto. Sono basati principalmente su sequenze che si ripetono (es. spesso pixel vicini = colori simili) 18 Immagini vettoriali invece dei pixel: figure geometriche elementari immagini vettoriali: tag segmento da coordinata 0,0 a 100,100 cerchio abcd scritta abcd in rosso origine: in alto a sinistra 19 Immagini vettoriali immagini vettoriali: meccanismo sequenze di caratteri (o numeri) nell'esempio: da