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

好的,我想打印一个string在我的Windows XP控制台。 控制台不能打印几个字符,所以我必须编码到我的stdout.encoding这是'cp437'。 但打印编码的string,“ß”打印为“\ xe1”。 解码回unicode并打印string后,我得到我想要的输出。 但是这感觉有些不妥。 如何正确的方式来打印一个string,并得到? 对于不可打印的字符?

>>>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我在找什么。 非常感谢!

要打印使用控制台代码页无法表示的Unicode字符,可以使用使用Unicode API(例如ReadConsoleW/WriteConsoleW() win-unicode-console Python包直接从/向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 

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


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

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

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

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

由于空闲使用tkinter,它也可以。 运行一个空闲的编辑器文件(称为tem.py)包含

 print('Bla \u2013 großes') 

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

 Bla – großes 

一个文件可以通过-m和-r从控制台空闲运行。

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

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