python3打印unicode到windows xp控制台编码cp437

时间:2015-02-15 00:49:04

标签: windows python-3.x unicode printing

好的,我想在我的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:正是我想要的。非常感谢!

2 个答案:

答案 0 :(得分:3)

要打印无法使用控制台代码页表示的Unicode字符,您可以使用win-unicode-console Python package使用Unicode API(例如ReadConsoleW/WriteConsoleW())直接从/向Windows控制台读取/写入Unicode:< / p>

#!/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模块(包含在包中)在Windows控制台中运行支持Unicode的普通脚本:

C:\> py -m run unmodified_script_that_prints_unicode.py

要安装win_unicode_console模块,请运行:

C:\> pip install win-unicode-console

确保选择能够在Windows控制台中显示Unicode字符的字体。


要将Python脚本的输出保存到文件,可以使用PYTHONIOENCODING envvar:

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

不要在脚本中硬编码环境的字符编码,而是打印Unicode。这些示例显示可以使用相同的脚本使用不同的编码和不同的方法打印到控制台和文件。

答案 1 :(得分:3)

另一种解决方案是不使用残缺的Windows控制台进行一般的unicode输出。 Tk文本小部件(作为tkinter文本实例访问)只要选定的字体将处理所有BMP字符。

由于Idle使用了tkinter,它也可以。运行包含

的空闲编辑器文件(称为tem.py)
print('Bla \u2013 großes')

在Shell窗口中打印以下内容。

Bla – großes

可以使用-m和-r。

从控制台通过Idle运行文件
C:\>python -m idlelib -r c:/programs/python34/tem.py

这将打开一个shell窗口并打印与上面相同的内容。或者您可以使用标签或文本小部件创建自己的tk窗口。