Как уже говорили другие, # coding:
указывает кодировку, в которой сохраняется исходный файл. Вот несколько примеров, чтобы проиллюстрировать это:
Файл сохранен на диске как cp437 (моя кодировка консоли), но не объявлена кодировка
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Вывод:
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
Вывод файла с # coding: cp437
добавленными:
über '\x81ber'
über u'\xfcber'
Сначала Python не знал кодировки и жаловался на символ, отличный от ASCII. Как только он узнал кодировку, байтовая строка получила байты, которые действительно были на диске. Для строки Unicode Python читал \ x81, знал, что в cp437 это был ü , и декодировал его в кодовую точку Unicode для ü, которая является U + 00FC. Когда байтовая строка была напечатана, Python отправил шестнадцатеричное значение 81
непосредственно на консоль. Когда строка Unicode была напечатана, Python правильно определил мою кодировку консоли как cp437 и преобразовал Unicode ü в значение cp437 для ü .
Вот что происходит с файлом, объявленным и сохраненным в UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
В UTF-8 ü кодируется как шестнадцатеричные байты C3 BC
, поэтому строка байтов содержит эти байты, но строка Unicode идентична первому примеру. Python прочитал два байта и правильно их декодировал. Python напечатал байтовую строку неправильно, потому что он отправил два байта UTF-8, представляющие ü, прямо на мою консоль cp437.
Здесь файл объявлен cp437, но сохранен в UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
Строка байтов все еще C3 BC
содержит байты на диске (шестнадцатеричные байты UTF-8 ), но интерпретирует их как два символа cp437 вместо одного символа в кодировке UTF-8. Эти два символа были переведены в кодовые точки Unicode, и все печатается неправильно.
# coding: utf8
достаточно хорошо, в этом нет необходимости-*-