python3将unicode打印到windowsxp控制台编码cp437



好的,我想在我的windowsxp控制台中打印一个字符串。控制台无法打印几个字符,所以我必须将其编码到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 ? groxe1es'
>>>print(var.encode('cp437', 'replace'))
b'Bla ? groxe1es'
>>>var.encode('cp437', 'replace').decode('cp437')
'Bla ? großes'
>>>print(var.encode('cp437', 'replace').decode('cp437'))
Bla ? großes

编辑:@Mark Ransom:由于我打印了很多,这让代码变得非常臃肿,我觉得:/

@孙:完全是我在找什么。非常感谢!

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

#!/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脚本的输出保存到文件中,可以使用PYTHONIOENCODINGenvvar:

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

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

另一种解决方案是不使用禁用的Windows控制台进行常规unicode输出。Tk文本小部件(作为tkinter-text实例访问)处理所有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窗口并打印与上面相同的内容。或者,您可以使用Label或Text小部件创建自己的tk窗口。

最新更新