Как вывести в консоль русские символы c выполняемой программы на python?

604 просмотра
0
0 Комментариев

Система ubuntu 16.04
Вывод команды print выдает \xd1\x80\xd1\x82\xd0\xbe\xd0\xb9.


Добавить комментарий

2 Answers

Python Опубликовано 16.12.2018
0

s = 'фыва'.encode()
print(s)
print(s.decode())

out:

b'\xd1\x84\xd1\x8b\xd0\xb2\xd0\xb0'
фыва

Добавить комментарий
0

Чтобы напечатать произвольный текст, используйте unicode тип:

print(u'\u0439')

То что вы видите \xd0\xb9 в выводе Питон программы говорит, что вы пытаетесь напечатать текстовое представление коллекции (такой как список, словарь в Питоне) или другого составного объекта, содержащего байты, а не unicode тип:

#XXX DO NOT DO IT
print [u'\u0439'.encode('utf-8')] # a bytestring in a list
# -> ['\xd0\xb9']

print(list_) в Питоне печатает элементы списка, вызывая repr() функцию для каждого отдельного элемента, аналог: print("[%s]" % ", ".join(map(repr, list_))). Подобное текстовое представление хорошо для отладки: оно призвано быть однозначным (во многих случаях eval(repr(obj)) == obj). См. Чем отличается __repr__ от __str__? Чтобы избежать вызова repr(), форматируйте вашу коллекцию вручную.

Чтобы получить человекочитаемый текст, декодируйте байты в том месте где вы их получаете (на границе с внешним миром), где у вас больше информации об их кодировке и передавайте текст внутри программы как unicode тип. Кодируйте текст обратно в байты, используя подходящее представление, только когда необходимо отдать данные (записать на диск, отправить по сети). Это так называемая концепция Unicode sandwich: «decode early, encode late, use Unicode inside».

Обратите внимание, что хотя попытка напечатать байты напрямую может иногда работать, но это может сломаться как только окружение изменится. К примеру, если вы напечатаете байты, которые представляют текст, закодированный в cp1251 кодировке, в окружении ожидающем cp866 кодировку, то вы можете получить кракозябы. Используйте Юникод для работы с текстом в Питоне. Более строгое отношение к смешиванию Unicode текста и байт—это одно из ключевых отличий Python 3 по сравнению с Python 2.

Бывают исключения, когда вашей программе приходится много работать с путями на *nix системе в Питоне 2, тогда удобно рассматривать пути как непрозрачные куки и получать/передавать их обратно системе как есть в виде байт. См. Как работать с путями c русскими символами?

При перенаправлении стандартного вывода в файл или канал (pipe) или если окружение не настроено (LC_ALL=C), вы можете получить UnicodeEncodeError: 'ascii'.. ошибку. В этом случае можно установить PYTHONIOENCODING переменную окружения, чтобы явно задать кодировку ввода/вывода:

$ PYTHONIOENCODING=utf-8 python -c 'print(u"\u0439")' > output.txt

См. подробнее в Python 3.4 и русские символы.

На Windows, может быть полезен win-unicode-console пакет. См. Как из Python вывести на Windows-консоль строку в Юникоде?


Если вы хотите печатать в тексте самой Питон-программы русские буквы, тогда на Python 2, необходимо явно декларировать используемую кодировку наверху .py файла; и чтобы не приходилось использовать u'' префикс для создания строк из констант ('') в тексте программы, можно включить unicode_literals:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
print('Здравствуй, мир!')

Обе опции можно опустить на Питоне 3 (по умолчанию всё работает).

Обратите внимание, что coding: utf-8 (кодировка исходного кода) не имеет никакого отношения к кодировке ввода/вывода—это независимые вещи.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up