2017-02-22 73 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' 

Или просто создать unicode строковый литерал (используя префикс u) непосредственно; интерактивный интерпретатор Python знает, использовать sys.stdin.encoding кодек для этого случая:

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

'locale.getpreferredencoding()' и 'sys.stdin.encoding' необязательно возвращают одно и то же значение. На американской консоли Windows первая возвращает 'cp1252', а последняя возвращает' cp437'. В консоли последнее правильно. –

+0

@MarkTolonen: ах, действительно; функция win32 API 'GetConsoleCP' используется для определения входной кодовой страницы, которая не отображается в Python. –