他の人が言ったように# 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は16進値81
をコンソールに直接送信しました。Unicode文字列が印刷された場合には、Pythonは正しくCP437としての私のコンソールエンコーディングを検出し、Unicodeの翻訳üをためCP437値にü。
UTF-8で宣言および保存されたファイルの処理は次のとおりです。
├╝ber '\xc3\xbcber'
über u'\xfcber'
UTF-8では、üは16進バイトとしてエンコードされるC3 BC
ため、バイト文字列にはそれらのバイトが含まれますが、Unicode文字列は最初の例と同じです。Pythonは2バイトを読み取り、正しくデコードしました。Pythonはバイト文字列を誤って出力しました。これは、üを表す2つのUTF-8バイトが直接cp437コンソールに送信されたためです。
ここでは、ファイルはcp437と宣言されていますが、UTF-8で保存されています。
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
バイト文字列は引き続きディスク上のバイト(UTF-8 hex bytes C3 BC
)を取得しましたが、それらを単一のUTF-8エンコード文字ではなく2つのcp437文字として解釈しました。これらの2つの文字はUnicodeコードポイントに変換され、すべてが正しく印刷されません。
# coding: utf8
十分ですが、必要ありません-*-