Como han dicho otros, # coding:
especifica la codificación en la que se guarda el archivo fuente. Aquí hay algunos ejemplos para ilustrar esto:
Un archivo guardado en el disco como cp437 (codificación de mi consola), 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 de archivo con # coding: cp437
agregado:
über '\x81ber'
über u'\xfcber'
Al principio, Python no sabía la codificación y se quejó del carácter no ASCII. Una vez que conocía la codificación, la cadena de bytes obtuvo los bytes que estaban realmente en el disco. Para la cadena Unicode, Python leyó \ x81, sabía que en cp437 eso era un ü , 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
a la consola directamente. Cuando se imprimió la cadena Unicode, Python detectó correctamente la codificación de mi consola como cp437 y tradujo Unicode ü al valor cp437 para ü .
Esto es lo que sucede con un archivo declarado y guardado en UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
En UTF-8, ü se codifica como bytes hexadecimales C3 BC
, por lo que la cadena de bytes contiene esos 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 incorrectamente, porque envió los dos bytes UTF-8 que representan ü directamente a mi consola cp437.
Aquí el archivo se declara cp437, pero se guarda en UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
La cadena de bytes todavía tenía los bytes en el disco (bytes hexadecimales UTF-8 C3 BC
), pero los interpretó como dos caracteres cp437 en lugar de un solo carácter codificado en UTF-8. Esos dos caracteres se tradujeron a puntos de código Unicode, y todo se imprime incorrectamente.
# coding: utf8
es lo suficientemente bueno, no es necesario-*-