web-dev-qa-db-ja.com

Pythonがutf-8でエンコードされたソースファイルを認識しないのはなぜですか?

ASCII文字以外の小さなtmp.py:

if __name__ == "__main__":
    s = 'ß'
    print(s)

それを実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File ".\tmp.py", line 3, in <module>
    print(s)
  File "C:\Python32\lib\encodings\cp866.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xdf' in position 0: character maps to <undefined>

Python docs says

デフォルトでは、PythonソースファイルはUTF-8でエンコードされたものとして扱われます...

エンコーディングをチェックする私の方法はFirefoxを使用することです(誰かがもっと明白な何かを提案するかもしれません)。 Firefoxでtmp.pyを開き、[表示]-> [文字エンコード]-> [Unicode(UTF-8)]を選択すると、問題がないように見えます。これは、この質問の上記のように見えます(ß記号付き)。

私が置く場合:

# -*- encoding: utf-8 -*-

tmp.pyの最初の文字列として、何も変更されません。エラーが持続します。

誰かが私が間違っていることを理解するのを手伝ってもらえますか?

18
Anton Daneyko

端末が使用している のエンコーディングはその文字をサポートしていません:

>>> '\xdf'.encode('cp866')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/encodings/cp866.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character '\xdf' in position 0: character maps to <undefined>

Pythonはそれをうまく処理しています、それを処理できないのはあなたの出力エンコーディングです。

Windowsコンソールでchcp 65001を使用して、コードページを切り替えることができます。 chcpは、コードページを変更するためのWindowsコマンドラインコマンドです。

私の場合、OS X(UTF-8を使用)では問題なく処理できます。

>>> print('\xdf')
ß
32
Martijn Pieters