Python 2.7:在Windows控制台中输出UTF-8

6

假设我们

s = u"test\u0627\u0644\u0644\u0647 \u0623\u0643\u0628\u0631\u7206\u767A\u043E\u043B\u043E\u043B\u043E"

如果我直接尝试打印它,

>>> print s
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character u'\u0627' in position 4: illegal multibyte sequence

我需要在Python中将控制台更改为UTF-8(否则它无法理解我的输入)。

import win32console
win32console.SetConsoleOutputCP(65001)
win32console.SetConsoleCP(65001)

然后将字符串编码为utf-8格式输出,因为Python不知道chcp 65001是UTF-8(一个已知的错误)。

>>> print s.encode('utf-8')
testالله أكبر爆発ололоTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 0] Error

如您所见,它在打印到换行符之前一切正常,但一旦遇到换行符就会抛出IOError错误。

以下解决方法有效:

def safe_print(str):
    try:
        print str.encode('utf-8')
    except:
        pass
    print

>>> safe_print(s)
testالله أكبر爆発ололо

但是肯定有更好的方法。有什么建议吗?

1
希望您不要真的将参数命名为 str。避免与内置函数重名。 - Chris Morgan
@Chris:一个人怎么知道什么是内置的,什么不是呢?这是非常自然的事情。你如何保证干净的命名空间行为,而不需要普遍的起始知识呢? - tchrist
在这种情况下,可能会非常令人困惑,因为“str”类型确实具有一个编码方法。 - agf
@tchrist - 大多数带有Python模式的编程编辑器都应该以不同颜色突出显示内置函数。这是确保您不会意外将其用作变量或参数名称的最简单方法。 - DaveP
@DaveP:我从未在生活中使用过彩色编辑器。我发现那些需要集成开发环境才能编程的语言太难了。一个人应该能够独立完成,而不是依赖程序作为支撑。否则就太脆弱和危险了。 - tchrist
3
如果你从不使用语法高亮,那么你会让自己的生活变得比必要的更加困难。它可以捕捉到很多小问题,比如重复定义内置对象和未闭合的注释/字符串。如果不使用语法高亮,会过于脆弱和危险。;-) - marcus
2个回答

4

1
我没有在Windows上测试过它,但是 这里 你可以得到一个小的初始化脚本,用于设置输出编码,并包括日志记录接口等,适用于win / linux。该模块还会使输出变为彩色(包括“记录”接口的更新),但是你可以轻松地削减掉不必要的功能 :-)。
如何调用无色变体:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from setupcon import setup_console
setup_console('utf-8', False)

以及彩色变体:

import setupcon
setupcon.setup_console()
import logging
#...
if setupcon.ansi:
    logging.getLogger().addHandler(setupcon.ColoredHandler())

如果这个解决方案对您有用,您可以在这里阅读文档:http://habrahabr.ru/blogs/python/117236/ (俄文)。或者,我/某人可以根据您的要求为您翻译它 :-).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接