Простой print() не срабатывает. Интерпретатор валится с жалобой на то, что он са
не может сконвертировать Юникод в ту кодировку, которая используется в Windows-консоли. Может быть ему можно как-то помочь? Возможно, есть какой-нибудь модуль, который умеет это делать.
Ответы
Ответ 1
Обновление: Python 3.6 использует Unicode API для ввода/вывода в консоль как упомянуты
ниже win_unicode_console пакет (подробнее в PEP 528). По умолчанию поддерживаются произвольные Unicode символы. Простой print(unicode_string) теперь работает без установки дополнительного ПО (консольный шрифт, поддерживающий желаемые символы, по прежнему нужно настраивать).
На границе с Windows-консолью используется Unicode, внутри sys.stdin, sys.stdout
sys.stderr используют utf-8 кодировку. Это может сломать код, который использовал двоичны
интерфейс для вывода в консоль и соответственно использовал OEM codepage, к пример
cp866 кодировку. cp866 не совместима с utf-8, можно получить кракозябры в таком случае. Необходимо либо исправить код, чтобы он текст, а не байты в консоль выводил, либо выставить %PYTHONLEGACYWINDOWSIOENCODING% переменную окружения, чтобы старое поведение восстановить.
Поведение для перенаправленного ввода в файл, в канал (pipe) осталось прежним: используется locale.getpreferredencoding(False) по умолчанию (ANSI codepage, к примеру cp1251).
Это давняя проблема в Питоне. Пакет win_unicode_console добавляет наиболее полну
поддержку Юникода как для вывода, так и для ввода текста в консоли—можно использовать этот пакет не меняя своего исходного кода c помощью включённого run модуля:
C:\> py -m pip install win-unicode-console
C:\> py -m run path\your_script.py
Это позволяет печатать произвольные Юникод символы, даже те которые не представим
в текущей кодировке консоли (такой как cp866), например, print(u'\N{snowman}') -> ☃ (могут быть корректно показаны все BMP Unicode символы, поддерживаемые настроенными шрифтами. Даже не-BMP символы можно скопировать в другие программы из консоли).
В качестве одноразового решения (без новых пакетов), можно установить переменну
окружения PYTHONIOENCODING:
C:\> set PYTHONIOENCODING=utf-8
C:\> py path\your_script.py > output_in_utf8.txt
Оба решения, не добавляют жёстко прописанную кодировку внутрь скрипта, делая их более переносимыми.
Ответ 2
Вот простой пример вывода в консоль текста (Python 2.7)
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('cp866') # Устанавливаем кодировку вывода консоли.
print(u'Произвольный текст')
Ответ 3
вполне возможен такой вариант:
код
# -*- coding: utf8 -*-
def out_console(txt=''):
print txt.decode('utf8') # работает
print txt.encode('utf8') # вызовет ошибку
a='проверка текста'
out_console(a)
Хочу обратить ваше внимание, что оператор "print" лучше сделать через sys.stdou
-- объект файла. Это позволит избежать проблем совместимости между python2 и python3.
Чтобы не было одноразовым вариантом, как в ответе выше, можно сделать в самом скрипте следующее:
код
# -*- codng: utf8 -*-
import sys
sys.putenv('PYTHONIOENCODING', 'utf8')
Этого будет достаточно, чтобы установить кодировку для текущего процесса и всех дочерних
В моём примере лишнее, так как первая строка в моём скрипте как раз затачивает интерпретатор под кодировку utf8.
Разумеется, сам код должен быть сохранён в кодировке utf8. Для этих целей рекомендую редактор Geany (универсальное решение), либо Kate (преимущественно Linux).
Комментариев нет:
Отправить комментарий