Como já foi dito, # coding:
especifica a codificação na qual o arquivo de origem é salvo. Aqui estão alguns exemplos para ilustrar isso:
Um arquivo salvo no disco como cp437 (codificação do meu console), mas nenhuma codificação declarada
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Resultado:
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
Saída do arquivo com # coding: cp437
adição:
über '\x81ber'
über u'\xfcber'
No começo, o Python não conhecia a codificação e reclamou do caractere não ASCII. Depois de conhecer a codificação, a sequência de bytes obteve os bytes que estavam no disco. Para a cadeia Unicode, o Python leu \ x81, sabia que no cp437 era um ü e o decodificou no ponto de código Unicode para ü, que é U + 00FC. Quando a sequência de bytes foi impressa, o Python enviou o valor hexadecimal 81
ao console diretamente. Quando a string Unicode foi impressa, o Python detectou corretamente a codificação do console como cp437 e converteu Unicode ü no valor cp437 de ü .
Aqui está o que acontece com um arquivo declarado e salvo em UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
No UTF-8, ü é codificado como bytes hexadecimais C3 BC
, portanto a sequência de bytes contém esses bytes, mas a sequência Unicode é idêntica ao primeiro exemplo. O Python leu os dois bytes e decodificou-o corretamente. O Python imprimiu a sequência de bytes incorretamente, porque enviou os dois bytes UTF-8 que representam ü diretamente ao meu console do cp437.
Aqui, o arquivo é declarado cp437, mas salvo em UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
A sequência de bytes ainda obteve os bytes no disco (bytes hexadecimais UTF-8 C3 BC
), mas os interpretou como dois caracteres cp437 em vez de um único caractere codificado em UTF-8. Esses dois caracteres foram traduzidos para pontos de código Unicode e tudo é impresso incorretamente.
# coding: utf8
é bom o suficiente, não há necessidade de-*-