Як уже говорили інші, # 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'
Рядок байтів все ще отримав байти на диску (UTF-8 шістнадцяткових байтів C3 BC
), але інтерпретував їх як два символи cp437 замість одного символу, кодованого UTF-8. Ці два символи, де переведено на код коду Unicode, і все друкується неправильно.
# coding: utf8
досить хороший, не потрібно-*-