#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')) Этот фильм хорош Полезную информацию, также можете найти здесь, здесь, здесь и здесь
Комментариев нет:
Отправить комментарий