Страницы

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

вторник, 26 ноября 2019 г.

Как из Python вывести на Windows-консоль строку в Юникоде?


Простой 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).

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

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