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.