Estratto del documento

Codifiche stringhe

Codifica: insieme di regole che permettono di associare concetti a configurazioni del supporto di memorizzazione/trasmissione. La stessa informazione può essere scritta su supporti differenti e con codifiche differenti. Lo stesso supporto può essere decodificato in maniera differente.

Problema della codifica del testo

Nell’informatica, la codifica del testo ha sempre creato problemi. Scenario (problema) tipico:

  • Testo codificato con la codifica XYZ in sequenze di byte
  • Sequenze di byte trasferite ad un altro programma/elaboratore
  • Testo ricostruito usando una decodifica non adeguata

Diverse codifiche per il testo

  • ASCII: 7 bit per carattere, sono codificate solo le lettere dell’alfabeto inglese (niente lettere accentate)
  • Latin-1 (ISO-8859-1): 8 bit per carattere, sono codificate le lettere delle principali lingue dell'Europa dell'ovest. Alcuni ‘slot’ sono lasciati non specificati (per sviluppi futuri)
  • Windows-1252: Variante del Latin-1, alcuni caratteri di uso poco frequente sono stati sostituiti
  • Unicode

Il codice ASCII (American Standard Code for Information Interchange)

È il codice alfanumerico più diffuso per lo scambio di informazioni fra sistemi di elaborazione. Costituisce di fatto uno standard per la codifica dell’informazione nei sistemi di elaborazione. È codificato su 7 bit, quindi può rappresentare al massimo 27 = 128 simboli diversi. Esiste una versione del codice ASCII che usa un ottavo bit (1 byte). Tale codice viene detto Codice ASCII esteso, ed è, ad esempio, usato nei personal computer IBM MS/DOS.

ASCII code for space character: 32+0 = 32
ASCII code for 'L': 64+12 = 76
ASCII code for 'a': 96+1 = 97

Problema: lettere accentate

Non sono gestite le lettere accentate (non sono presenti nell’alfabeto inglese).

Per risolvere il problema – dopo l'ASCII

Per gestire i caratteri specifici delle lingue diverse dall’inglese sono state create diverse codifiche:

  • ASCII estesa (8 bit)
  • Big5 (Traditional Chinese)
  • ISO-8859-1 “Latin-1” (fra, ita, spa, ted…)
  • ISO-8859-7 (Greek)
  • ISO-8859-6 (Arabic)
  • CP1140 (IBM Western Europe)
  • ...

Molte codifiche sono tra loro incompatibili.

Problema: decodifica corretta

Per decodificare correttamente una sequenza di bit, devo conoscere la codifica usata.

Unicode

Lo standard Unicode è stato introdotto per rappresentare caratteri di testo in sistemi informatici ed è stato assunto come standard internazionale con la sigla ISO/IEC 10646.

  • Unicode propone uno standard per rappresentare i caratteri e simboli di tutti i linguaggi scritti, simboli matematici, ecc.
  • Arriva a usare fino a 4 byte per carattere (file 4 volte più grossi rispetto alla codifica ASCII)
  • 32 bit (4 byte)
  • Codifica tutte le lingue conosciute
  • Anche i segni speciali, es. ©

Vantaggi: codifica tutto! (per lo meno i caratteri delle lingue attualmente conosciute)

Una stringa di caratteri Unicode necessita di un’ulteriore trasformazione per poter essere salvata, scambiata tra sistemi, interpretata da un browser. Tale processo di trasformazione in stringa di byte (o anche stringa binaria) è demandato ad un codec.

Codec

Un codec è una codifica di trasformazione: dato un carattere Unicode restituisce la corrispondente sequenza di byte. Esistono diversi codec compatibili con Unicode, la maggior parte di loro non è in grado di codificare tutti i caratteri standardizzati dallo Unicode:

  • UTF-8: salva i caratteri Unicode in 8 bit (può essere usato solo per un sottoinsieme dell’alfabeto Unicode)
  • UTF-16: salva i caratteri Unicode in 16 bit (come sopra ma valido per un sottoinsieme più ampio, con 16 bit è possibile codificare 216 = 65.000 caratteri distinti)
  • ...

Differenze Python 2 e 3

Esistono diverse versioni del linguaggio Python:

  • Python 2.x
  • Python 3.x

Ci sono stati dei grossi cambiamenti dalla versione 2.x alla 3.x. Le librerie non sono ancora state adeguate, per questo motivo la versione 2.x continua ad essere usata da tante persone (compreso il nostro corso). La comunità degli sviluppatori Python sta portando avanti le due versioni in parallelo. La versione 2.x sarà abbandonata fra qualche anno.

Python 2.x

  • Default: memorizza internamente le stringhe usando una codifica a 8 bit salvo diversa indicazione
  • Necessario indicare la codifica utilizzata
  • La codifica utilizzata per interpretare i raw data può essere modificata
  • Utile passando da una nazione all’altra
  • Tuttavia è fonte di grossi problemi
  • Per interpretare la sequenza di byte, l’interprete Python deve capire quale codifica applicare
  • Codifica desunta dalle informazioni di localizzazione (maggior dettagli nelle prossime slide)
  • A volte la codifica non è individuata correttamente
  • Problemi difficili da individuare (sorgono quando si cerca di usare una stringa e non quando questa viene creata/inserita)
  • Su richiesta, può codificare internamente le singole stringhe in Unicode

Python 3.x

  • Default: memorizza internamente le stringhe come Unicode
  • Appena una stringa entra dall’esterno è subito convertita in Unicode
  • Problemi identificati in anticipo (segnalati dal fallimento della conversione a Unicode)

Creazione/importazione di stringhe

Creazione/input di stringhe in uno script Python, scenari:

  • Dichiarazione esplicita di variabili
  • Lettura di dati da file
  • Passaggio parametri in funzioni
  • Comunicazioni di rete (non lo trattiamo)
  • ...

Vedremo come gestire le codifiche/convertire le stringhe in Unicode nei diversi scenari di cui sopra. Approccio consigliato: cercate di convertire in Unicode tutto ciò che entra nel vostro script.

Direttiva coding

  • La direttiva coding stabilisce come decodificare le variabili create nello script
  • Come scelgo la codifica per la direttiva coding?
    • #coding=utf8
    • #coding:utf16
    • # -*- coding: latin-1 -*-
  • Dipende da come è stato codificato il file .py
  • Gli editor di testo non usano tutti la stessa codifica
  • Questo è il motivo per cui aprendo un file .txt con editor diversi... a volte appaiono caratteri strani
  • Per conoscere la codifica utilizzata, dovete consultare il manuale dell’editor

Dichiarazione esplicita di variabili

Esempio di script:

a="Cos'è quella scatola?”
print(a)

SyntaxError: Non-ASCII character '\xc3' in file es3_nolocale.py on line 1, but no encoding declared;

Altro esempio:

#coding=utf8
# utf8 è informazione di localizzazione
a="Cos'è quella scatola?”
print(a) # esecuzione senza problemi

La direttiva coding deve essere inserita nelle prime due righe dello script. In assenza di direttiva coding, in Python 2.x (con x>=5): utilizzata la codifica ASCII. Si può forzare Python 2.x a memorizzare una stringa in Unicode:

#coding=utf8
st='ciao'
unst=st.decode('utf8') #decodifica da utf8 a Unicode
print(type(unst),unst) #(, u'ciao')

... in forma breve:

unst=u'ciao’ #equivalente a : unst=‘ciao’.decode(‘…’)

La codifica è quella specificata dalla direttiva coding.

La direttiva coding stabilisce come decodificare solo le variabili create nello script, per le altre variabili...

Libreria codecs per i file di testo

  • Python mette a disposizione la libreria codecs per aprire file di testo con codifiche diverse dalla ASCII
import codecs
f = codecs.open(’file.txt', ‘r’, encoding=’latin1’, errors=‘ignore’)
...f.close()
  • Permette di specificare dei parametri aggiuntivi rispetto alla open standard. Per il resto, il suo uso è identico alla libreria standard di apertura dei file
  • Si può continuare ad usare .read(), .readline() ...
  • Le stringhe lette dai comandi .read(), .readline(), vengono gestite in memoria come Unicode
f = codecs.open(… encoding='utf-16’, errors=‘ignore’)

Encoding e errors parametri opzionali:

  • Possono non essere usati
  • Se usato: nome_parametro = valore
  • encoding: permette di specificare la codifica
  • errors: (possibili valori) ‘strict’, ‘ignore’, ‘replace’
    • strict: il programma si blocca e genera un errore se incontra un carattere non riconosciuto nel file
    • ignore: i caratteri non riconosciuti sono ignorati (come se non esistessero nel file)
    • replace: si sostituisce un carattere speciale ai caratteri non riconosciuti

Esempio

import codecs
f = codecs.open(’file.txt', ‘r’, encoding='utf-16’)
for line in f:
    values=line.split(u‘;’)
    if values[0]==u”Rossi”:
        print(“Trovato”)
f.close()

I dati letti sono tutti memorizzati in stringhe in formato Unicode.

Stringhe e Unicode

Cosa viene visualizzato (True o False)?

#coding=utf8
print('ciao' == u'ciao') # True

Cosa viene visualizzato (True o False)?

#coding=utf8
print('ciao né' == u'ciao né') # False

UnicodeWarning: Unicode equal comparison failed to convert

Anteprima
Vedrai una selezione di 5 pagine su 19
Laboratorio Informatica Pag. 1 Laboratorio Informatica Pag. 2
Anteprima di 5 pagg. su 19.
Scarica il documento per vederlo tutto.
Laboratorio Informatica Pag. 6
Anteprima di 5 pagg. su 19.
Scarica il documento per vederlo tutto.
Laboratorio Informatica Pag. 11
Anteprima di 5 pagg. su 19.
Scarica il documento per vederlo tutto.
Laboratorio Informatica Pag. 16
1 su 19
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher aina.belloni di informazioni apprese con la frequenza delle lezioni di Laboratorio di informatica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Milano - Bicocca o del prof Boselli Roberto.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community