2017-02-22 6 views
0

次のコードは正常に動作すると期待していますが、失敗しています。理由は何ですか?Python 2.7文字列のデコードに失敗しました。

>>> s = 'ö' 
>>> s.decode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x94 in position 0: invalid start byte 
+1

あなたの文字列がUTF-8でエンコードされていません。どのコンソールを使用していますか? – MKesper

答えて

3

対話型インタープリタでは、文字列リテラルのエンコーディングは、端末またはコンソールの設定によってまったく異なります。あなたの場合は、ではなく、がUTF-8に設定されています。

あなたが使用するコーデックかを決定するためにsys.stdin.encoding属性を使用することができます。

また
>>> s = 'ö' 
>>> import sys 
>>> s.decode(sys.stdin.encoding) 
u'\xf6' 

、ちょうど直接(u接頭辞を使用して)リテラルunicode文字列を作成します。 Pythonの対話インタプリタは、そのような場合のためにsys.stdin.encodingコーデックを使用するために知っている:

>>> s = u'ö' 
>>> s 
u'\xf6' 
+0

'locale.getpreferredencoding()'と 'sys.stdin.encoding'は必ずしも同じ値を返すわけではありません。米国のWindowsコンソールでは、前者は 'cp1252'を返し、後者は' cp437'を返します。コンソールでは、後者は正しいです。 –

+0

@ MarkTolonen:ああ、確かに。 win32 APIの 'GetConsoleCP'関数を使用して入力コードページを決定します。入力コードページはPythonで公開されていません。 –

関連する問題