Gibt, wie andere gesagt haben, # coding:
die Codierung an, in der die Quelldatei gespeichert ist. Hier einige Beispiele, um dies zu veranschaulichen:
Eine Datei, die auf der Festplatte als cp437 (meine Konsolencodierung) gespeichert, aber keine Codierung deklariert ist
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Ausgabe:
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
Ausgabe der Datei mit # coding: cp437
hinzugefügt:
über '\x81ber'
über u'\xfcber'
Zuerst kannte Python die Codierung nicht und beschwerte sich über das Nicht-ASCII-Zeichen. Sobald die Codierung bekannt war, erhielt die Byte-Zeichenfolge die Bytes, die sich tatsächlich auf der Festplatte befanden. Für die Unicode-Zeichenfolge wusste Python \ x81, dass dies in cp437 ein ü war , und decodierte es in den Unicode-Codepunkt für ü, der U + 00FC ist. Beim Drucken der Byte-Zeichenfolge hat Python den Hex-Wert 81
direkt an die Konsole gesendet . Beim Drucken der Unicode-Zeichenfolge hat Python meine Konsolencodierung als cp437 korrekt erkannt und Unicode ü in den cp437-Wert für ü übersetzt .
Folgendes passiert mit einer in UTF-8 deklarierten und gespeicherten Datei:
├╝ber '\xc3\xbcber'
über u'\xfcber'
In UTF-8 wird ü als Hex-Byte codiert C3 BC
, sodass die Byte-Zeichenfolge diese Bytes enthält, die Unicode-Zeichenfolge jedoch mit dem ersten Beispiel identisch ist. Python hat die beiden Bytes gelesen und korrekt dekodiert. Python hat die Byte-Zeichenfolge falsch gedruckt, da die beiden UTF-8-Bytes, die ü darstellen, direkt an meine cp437-Konsole gesendet wurden.
Hier wird die Datei als cp437 deklariert, aber in UTF-8 gespeichert:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
Die Byte-Zeichenfolge enthält weiterhin die Bytes auf der Festplatte (UTF-8-Hex-Bytes C3 BC
), interpretiert sie jedoch als zwei cp437-Zeichen anstelle eines einzelnen UTF-8-codierten Zeichens. Diese beiden Zeichen wurden in Unicode-Codepunkte übersetzt, und alles wird falsch gedruckt.
# coding: utf8
ist gut genug, keine Notwendigkeit für-*-