Come altri hanno già detto, # coding:
specifica la codifica in cui viene salvato il file sorgente. Ecco alcuni esempi per illustrare ciò:
Un file salvato su disco come cp437 (la mia codifica della console), ma nessuna codifica dichiarata
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Produzione:
File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details
Output del file con # coding: cp437
aggiunto:
über '\x81ber'
über u'\xfcber'
All'inizio, Python non conosceva la codifica e si lamentava del carattere non ASCII. Una volta che ha conosciuto la codifica, la stringa di byte ha ottenuto i byte che erano effettivamente sul disco. Per la stringa Unicode, Python legge \ x81, sapeva che in cp437 quello era un ü e lo decodificava nel codepoint Unicode per ü che è U + 00FC. Quando la stringa di byte è stata stampata, Python ha inviato direttamente il valore esadecimale 81
alla console. Quando la stringa Unicode è stata stampata, Python ha rilevato correttamente la codifica della mia console come cp437 e ha tradotto Unicode ü nel valore cp437 per ü .
Ecco cosa succede con un file dichiarato e salvato in UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
In UTF-8, ü è codificato come byte esadecimali C3 BC
, quindi la stringa di byte contiene quei byte, ma la stringa Unicode è identica al primo esempio. Python ha letto i due byte e li ha decodificati correttamente. Python ha stampato la stringa di byte in modo errato, perché ha inviato i due byte UTF-8 che rappresentano ü direttamente alla mia console cp437.
Qui il file è dichiarato cp437, ma salvato in UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
La stringa di byte ha ancora i byte su disco (byte esadecimali UTF-8 C3 BC
), ma li ha interpretati come due caratteri cp437 invece di un singolo carattere codificato UTF-8. Quei due caratteri sono stati tradotti in punti di codice Unicode e tutto viene stampato in modo errato.
# coding: utf8
è abbastanza buono, non-*-