Python3 print unicode для windows xp console encode cp437

Хорошо, я хочу напечатать строку в моей консоли Windows XP. Есть несколько символов, которые не могут быть напечатаны консолью, поэтому мне нужно закодировать мой stdout.encoding, который является "cp437". но печатая закодированную строку, "ß" печатается как "\ xe1". после декодирования обратно в unicode и печати строки, я получаю вывод, который я хочу. но это несколько неправильно. как правильно напечатать строку и получить? для непечатаемых символов?

>>>var
'Bla \u2013 großes'
>>>print(var)
UnicodeEncodeError: 'charmap' codec can't encode character '\u2013'

>>>var.encode('cp437', 'replace')
b'Bla ? gro\xe1es'
>>>print(var.encode('cp437', 'replace'))
b'Bla ? gro\xe1es'

>>>var.encode('cp437', 'replace').decode('cp437')
'Bla ? großes'
>>>print(var.encode('cp437', 'replace').decode('cp437'))
Bla ? großes

изменить: @Mark Ransom: поскольку я печатаю много, это делает код довольно раздутым, я чувствую:/

@eryksun: именно то, что я искал. спасибо большое!

Ответ 1

Чтобы печатать символы Unicode, которые не могут быть представлены с использованием кодовой страницы консоли, вы можете использовать win-unicode-console Пакет Python, который использует Unicode API таким образом как ReadConsoleW/WriteConsoleW() для прямой записи/записи Unicode из консоли/в консоль Windows:

#!/usr/bin/env python3
import win_unicode_console

win_unicode_console.enable()
try:
    print('Bla \u2013 großes')
finally:
    win_unicode_console.disable()

сохраните файл test_unicode.py и запустите его:

C:\> py test_unicode.py

Вы должны увидеть:

Bla – großes

В качестве предпочтительной альтернативы вы можете использовать модуль run (входит в комплект) для запуска обычного script с поддержкой поддержки Unicode в консоли Windows:

C:\> py -m run unmodified_script_that_prints_unicode.py

Чтобы установить модуль win_unicode_console, запустите:

C:\> pip install win-unicode-console

Обязательно выберите шрифт, способный отображать символы Unicode в консоли Windows.


Чтобы сохранить вывод файла Python script в файл, вы можете использовать PYTHONIOENCODING envvar:

C:\> set PYTHONIOENCODING=utf-8:backslashreplace
C:\> py unmodified_script_that_prints_unicode.py >output_utf8.txt

Не скопируйте кодировку символов вашей среды внутри вашего script, напечатайте Unicode. Примеры показывают, что один и тот же script может использоваться для печати на консоль и в файл с использованием разных кодировок и разных методов.

Ответ 2

Альтернативное решение состоит в том, чтобы не использовать поврежденную консоль Windows для общего выхода в формате unicode. Текстовые виджеты Tk (доступные как текстовые экземпляры tkinter) обрабатывают все символы BMP до тех пор, пока выбранный шрифт будет.

Так как Idle использует tkinter, он также может. Запуск файла редактора Idle (вызов его tem.py), содержащего

print('Bla \u2013 großes')

печатает следующее в окне оболочки.

Bla – großes

Файл можно запустить через Idle из консоли с помощью -m и -r.

C:\>python -m idlelib -r c:/programs/python34/tem.py

Это открывает окно оболочки и печатает то же, что и выше. Или вы можете создать собственное окно tk с помощью виджета Label или Text.