Come altri hanno già detto, # coding:
specifica la codifica in cui è salvato il file di origine.Ecco alcuni esempi per illustrare questo:
un file salvato sul disco come CP437 (la mia codifica console), ma nessuna codifica dichiarato
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
uscita:
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
Uscita del file con # coding: cp437
aggiunto:
über '\x81ber'
über u'\xfcber'
Inizialmente, Python non conosceva la codifica e si lamentava del carattere non ASCII. Una volta che conosceva la codifica, la stringa di byte otteneva i byte che erano effettivamente sul disco. Per la stringa Unicode, Python leggeva \ x81, sapeva che in cp437 era ü e lo decodifica nel punto di codice Unicode per ü che è U + 00FC. Quando la stringa di byte è stata stampata, Python ha inviato direttamente il valore esadecimale 81
alla console. Quando è stata stampata la stringa Unicode, Python ha rilevato correttamente la codifica della console come cp437 e tradotto Unicode ü nel valore cp437 per ü.
Ecco cosa succede con un file dichiarata e salvato in UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
In UTF-8, ü è codificato come l'esagono byte C3 BC
, quindi la stringa di byte contiene quei byte , ma la stringa Unicode è identica al primo esempio. Python legge i due byte e decodifica 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.
Ecco il file viene dichiarato CP437, ma salvato in UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
La stringa di byte ancora ottenuto i byte su disco (UTF-8 esadecimale byte C3 BC
), ma li interpretato come due caratteri cp437 invece di un singolo carattere con codifica UTF-8. Questi due caratteri vengono convertiti in punti codice Unicode e tutto viene stampato in modo errato.
'# codifica: utf8' è abbastanza buono, non c'è bisogno per' - * - ' – jellyfish
@jellyfish presumo si intende digitare' # codifica: utf -8'. –
Dovrebbe essere '# coding = utf-8'. https://www.python.org/dev/peps/pep-0263/ –