Расшифровка кириллицы в Python - отображение символов на <undefined>

Я получаю ответ от сервера, байты:

\ xd0 \ xa0 \ xd1 \ x83 \ xd0 \ xb1 \ xd0 \ xbb \ xd0 \ xb8 \ xd0 \ xa0 \ xd0 \ xa4 \ xd0 \ x9a \ xd0 \ xa6 \ xd0 \ x91

Это наверняка кириллица, но я не уверен, какая кодировка. Каждая попытка декодировать его в Python терпит неудачу:

b = b'\xd0\xa0\xd1\x83\xd0\xb1\xd0\xbb\xd0\xb8 \xd0\xa0\xd0\xa4 \xd0\x9a\xd0\xa6\xd0\x91'
>>> b.decode('utf-8')
'\u0420\u0443\u0431\u043b\u0438 \u0420\u0424 \u041a\u0426\u0411'
>>> print(b.decode('utf-8'))
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-4:
character maps to <undefined>

>>> b.decode('cp1251')
'\u0420\xa0\u0421\u0453\u0420±\u0420»\u0420\u0451 \u0420\xa0\u0420¤
\u0420\u0459\u0420¦\u0420\u2018'
>>> print(b.decode('cp1251'))
UnicodeEncodeError: 'charmap' codec can't encode character '\u0420' in
position 0: character maps to <undefined>

Оба результата чем-то напоминают Unicode-escape, но это тоже не работает:

>>> codecs.decode('\u0420\u0443\u0431\u043b\u0438 \u0420\u0424 \u041a\u0426\u0411',
'unicode-escape')
'Ð\xa0Ñ\x83бли Ð\xa0Ф Ð\x9aЦÐ\x91'

Есть веб-сервис для восстановления кириллических текстов, он может декодировать мои байты с помощью Windows-1251:

Выход (кодировка источника: WINDOWS-1251)

Рубли РФ КЦБ

Но у меня нет больше идей о том, как подойти к этому.

Я думаю, что мне чего-то не хватает в том, как работает кодирование, поэтому, если проблема кажется вам тривиальной, я был бы очень признателен за пояснения / ссылку на учебник / некоторые ключевые слова для дальнейшего поиска в Google.

Решение:

Windows PowerShell по умолчанию использует кодовую страницу Windows-850, которая не может обрабатывать некоторые символы кириллицы. Одним из исправлений является изменение кодовой страницы на Unicode при каждом запуске оболочки:

chcp 65001

Здесь объясняется, как сделать его новым по умолчанию

2 ответа

Решение

Это наверняка кириллица, но я не уверен, какая кодировка.

Это UTF-8 (100%).

Python 3.4.3 (default, Mar 25 2015, 17:13:50) 
Type "copyright", "credits" or "license" for more information.

IPython 4.0.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: b = b'\xd0\xa0\xd1\x83\xd0\xb1\xd0\xbb\xd0\xb8 \xd0\xa0\xd0\xa4 \xd0\x9a\xd0\xa6\xd0\x91'

In [2]: s = b.decode('utf-8')

In [3]: print(s)
Рубли РФ КЦБ

У меня отлично работает. Может быть, у вас есть проблемы с вашим терминалом или repl?

Попробуйте это.

 In [1]: s = "\xd0\xa0\xd1\x83\xd0\xb1\xd0\xbb\xd0\xb8 \xd0\xa0\xd0\xa4 \xd0\x9a\xd0\xa6\xd0\x91"

 In [11]: print s.decode('utf-8')
    Рубли РФ КЦБ

Для правильной печати или отображения некоторых строк их необходимо декодировать (строки Unicode).

В стандартной библиотеке Python много информации с примерами.

Python 3:

>>> import sys
>>> print (sys.version)
3.4.0 (default, Jun 19 2015, 14:20:21) 
[GCC 4.8.2]
>>> b = b'\xd0\xa0\xd1\x83\xd0\xb1\xd0\xbb\xd0\xb8 \xd0\xa0\xd0\xa4 \xd0\x9a\xd0\xa6\xd0\x91'
>>> b.decode('utf-8')
'Рубли РФ КЦБ'
Другие вопросы по тегам