Storia della questione:
La codifica (encoding) e la decodifica (decoding) dei dati sono diventate rilevanti con l'emergere della necessità di scambiare informazioni tra dispositivi, programmi e piattaforme che possono interpretare i simboli e la loro rappresentazione in memoria in modi diversi. In Python, questo problema è diventato acuto a causa della rigorosa separazione tra stringhe (str) e byte (bytes), a partire da Python 3.x, dove le stringhe sono sequenze di caratteri Unicode e i byte sono sequenze di byte.
Problema:
Lavorando con file, reti e sistemi esterni, spesso è necessario convertire i dati tra rappresentazioni byte e stringhe. Un uso improprio delle codifiche può portare a errori UnicodeEncodeError e UnicodeDecodeError, alla corruzione dei dati e a problemi di supporto per diverse lingue.
Soluzione:
In Python, per convertire una stringa in byte si utilizza il metodo .encode(), mentre per la conversione inversa — .decode(). La codifica più comune è "utf-8":
text = "Ciao, mondo!" encoded = text.encode('utf-8') # Codifica la stringa in bytes print(encoded) # b'\xd0\x9f\xd1\x80...' decoded = encoded.decode('utf-8') # Decodifica di nuovo in stringa print(decoded) # 'Ciao, mondo!'
Caratteristiche principali:
open(..., encoding='utf-8')).Cosa succede se si tenta di decodificare una stringa byte con una codifica errata?
Se si tenta di decodificare i byte utilizzando una codifica errata, si genererà un errore o si otterrà una stringa non corretta. Ad esempio:
b = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' wrong = b.decode('latin-1') print(wrong) # Restituisce una sequenza incomprensibile, non "Ciao"
È possibile concatenare direttamente una stringa e una stringa byte tramite +?
No. Questo solleverà un'eccezione TypeError.
s = "abc" b = b"def" # s + b # TypeError: can only concatenate str (not "bytes") to str
È possibile scrivere un file di testo senza specificare chiaramente la codifica?
Sì, ma questo è considerato una cattiva pratica poiché si utilizza la codifica di sistema predefinita, che dipende dalle impostazioni del sistema operativo, il che porterà a incompatibilità tra le piattaforme.
Un programmatore scrive un file di log in Windows senza specificare la codifica. Il log viene aperto in Linux o Mac, ma visualizza caratteri incomprensibili al posto del cirillico.
Vantaggi:
Svantaggi:
Un programmatore specifica sempre encoding='utf-8' quando lavora con i file:
with open('log.txt', 'w', encoding='utf-8') as f: f.write('Il programma è terminato con successo')
Vantaggi:
Svantaggi: