【问题标题】:python3 print unicode to windows xp console encode cp437python3打印unicode到windows xp控制台编码cp437
【发布时间】:2015-04-15 19:32:02
【问题描述】:

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

【问题讨论】:

  • 您可以设置sys.stdout = io.TextIOWrapper(sys.stdout.detach(), sys.stdout.encoding, 'replace') 保持相同的编码,但需要替换。
  • 我看不出你的最后一行有什么问题,这正是我要写的答案。
  • 省去很多麻烦,只需要一个支持 UTF-8 的 Python IDE。除了默认的语言环境字符之外,控制台对任何东西都毫无用处。

标签: windows python-3.x unicode printing


【解决方案1】:

要打印无法使用控制台代码页表示的 Unicode 字符,您可以使用 win-unicode-console Python package 使用 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 脚本的输出保存到文件中,您可以使用 PYTHONIOENCODING envvar:

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

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

【讨论】:

    【解决方案2】:

    另一种解决方案是不使用残废的 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 窗口并打印与上面相同的内容。或者您可以使用标签或文本小部件创建自己的 tk 窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 2010-11-28
      • 2019-01-30
      相关资源
      最近更新 更多