Страницы

Поиск по вопросам

пятница, 26 октября 2018 г.

Сломанная кодировка при выводе в Python 2.7

Имеется сценарий, когда я его выполняю, вместо русских символов появляется:
X Получено: None | Ожидалось: '\xd0\xad\xd1\x82\xd0\xbe\xd1\x82 \xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc \xd1\x85\xd0\xbe\xd1\x80\xd0\xbe\xd1\x88'.
Гугл предложил решение проблемы путем добавления в начало файла строк:
# -*- coding: utf-8 -*- from __future__ import unicode_literals
Но в таком случае появляется вывод:
u'\u042d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u043c \u0445\u043e\u0440\u043e\u0448'
Т.е добавляется префикс "u",но на итог это почти никак не влияет. Пробовал менять кодировку файла. Не помогает. Понимаю, вопрос глупый и решается, скорей всего, элементарно.
Код:
def main(): test(donuts(4), 'Количество : 4') test(donuts(9), 'Количество : 9')
Код функции:
def donuts(count):+ if count<10: rezult = 'Количество: {}'.format(count) else: rezult = 'Количество: много'
return rezult
Функция test
def test(got, expected): if got == expected: prefix = ' OK ' else: prefix = ' X ' print('%s Получено: %s | Ожидалось: %s' % (prefix, repr(got), repr(expected)))
Проблема одна и та же в Ubuntu и Windows. В данный момент пытаюсь бороться в Windows XP


Ответ

Кракозябы вы видите потому что используете байты, а не Unicode для текста, что ведёт к выводу текста в неправильной кодировке (текст закодированный в utf-8 выводится в Виндовой кодировке):
>>> u'Получено'.encode('utf-8').decode('cp1251') 'Получено'
Не используйте байты, используйте Unicode для представления текста
from __future__ import unicode_literals заставляет 'abc' строковые константы создавать Unicode строки на Питоне 2 (их поведение из Питона 3). В противном случае, используйте u'' префикс, чтобы текст в виде констант в коде задавать.

u'\u042d\u0442\u043e' появляется потому что вы вызываете repr() функцию, которая возвращает текстовое представление объекта. Задача repr() функции получить однозначное представление объекта, например, для отладки, тестов. Идеально, когда eval(repr(obj)) == obj
В общем случае, чтобы напечатать Юникодную строчку в Питоне, уберите repr()
>>> print(u'\u042d\u0442\u043e') Это
Если печатаемые символы поддерживаются в текущем окружении (кодировка консоли на Винде, правильная локаль в *nix), то этого достаточно. Если вывод текста перенаправлен в Питоне 2 или хочется произвольные символы печатать на Windows, даже те которые не поддерживаются OEM codepage такой как cp866, то настройте PYTHONIOENCODING, если вывод перенаправлен в файл, pipe или установите win-unicode-console пакет, чтобы в Windows консоль показывать любые (BMP) символы (если правильный шрифт настроен)

Комментариев нет:

Отправить комментарий