Страницы

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

вторник, 10 декабря 2019 г.

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

#python #кодировка #python_2x


Имеется сценарий, когда я его выполняю, вместо русских символов появляется:

 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
    


Ответы

Ответ 1



Кракозябы вы видите потому что используете байты, а не 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) символы (если правильный шрифт настроен).

Ответ 2



Попробуйте так >>> print('\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'.decode('utf-8')) Этот фильм хорош Полезную информацию, также можете найти здесь, здесь, здесь и здесь

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

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