2015-02-15 3 views
0

Хорошо, я хочу напечатать строку в моей консоли xp x. Есть несколько символов, которые не могут быть напечатаны консолью, поэтому мне нужно закодировать мой stdout.encoding, который является «cp437». но печатая закодированную строку, «ß» печатается как «\ xe1». после декодирования обратно в unicode и печати строки, я получаю вывод, который я хочу. но это несколько неправильно. как правильно напечатать строку и получить? для непечатаемых символов?python3 print unicode to windows xp console encode cp437

>>>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: excactly то, что я искал. большое спасибо!

+0

Вы можете установить 'sys.stdout = io.TextIOWrapper (sys.stdout.detach(), sys.stdout.encoding, 'replace')', чтобы сохранить ту же кодировку, но с заменой. – eryksun

+0

Я не вижу ничего плохого в последней строке, которую у вас есть, это именно тот ответ, который я собирался написать. –

+0

Спасите себе массу неприятностей и просто получите Python IDE, поддерживающую UTF-8. Консоль практически бесполезна для всех, кроме символов локали по умолчанию. –

ответ

3

Для печати символов Unicode, которые не могут быть представлены с помощью консоли кодовую, вы можете использовать win-unicode-console Python package, который использует 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 модуль (входит в комплект поставки), чтобы запустить обычный сценарий с включенной поддержкой Unicode в консоли Windows:

C:\> py -m run unmodified_script_that_prints_unicode.py 

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

C:\> pip install win-unicode-console 

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


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

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

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

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.