Como han dicho otros, # coding:
especifica la codificación en la que se guarda el archivo de origen.Aquí están algunos ejemplos para ilustrar esto:
un archivo guardado en el disco como cp437 (mi consola de codificación), pero sin codificación declarada
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Salida:
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
Salida del archivo con # coding: cp437
agregado:
über '\x81ber'
über u'\xfcber'
Al principio, Python desconocía la codificación y se quejaba del carácter no ASCII. Una vez que conocía la codificación, la cadena de bytes obtenía los bytes que estaban realmente en el disco. Para la cadena Unicode, Python leyó \ x81, sabía que en cp437 era ü, y lo decodificó en el punto de código Unicode para ü que es U + 00FC. Cuando se imprimió la cadena de bytes, Python envió el valor hexadecimal 81
directamente a la consola. Cuando se imprimió la cadena Unicode, Python detectó correctamente la codificación de mi consola como cp437 y tradujo Unicode ü en el valor de cp437 para ü.
Esto es lo que ocurre con un archivo declarada y guardado en UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
En UTF-8, ü se codifica como los bytes hexagonal C3 BC
, por lo que la cadena de bytes contiene los bytes , pero la cadena Unicode es idéntica al primer ejemplo. Python leyó los dos bytes y lo decodificó correctamente. Python imprimió la cadena de bytes de forma incorrecta, porque envió los dos bytes UTF-8 que representan ü directamente a mi consola cp437.
Aquí el archivo se declara cp437, pero guarda en UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
La cadena de bytes todavía tiene los bytes en el disco (UTF-8 hexagonal bytes C3 BC
), sino que los interpreta como dos caracteres cp437 en lugar de un solo carácter codificado en UTF-8. Esos dos caracteres fueron traducidos a puntos de código Unicode y todo se imprime incorrectamente.
'# codificación: utf8' es lo suficientemente bueno, no hay necesidad de' - * - ' – jellyfish
@jellyfish supongo que quería decir que escribir' # codificación: utf -8'. –
Debe ser '# coding = utf-8'. https://www.python.org/dev/peps/pep-0263/ –