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

时间:2011-08-16 12:31:32

标签: python windows utf-8

让我们说

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(已知bug)。

>>> 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الله أكبر爆発ололо

但必须有更好的方法。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

Searching对于 python utf8 windows ,第一个结果是问题Getting python to print in UTF8 on Windows XP with the console,它描述了在Windows中从Windows打印utf8的问题。

答案 1 :(得分:1)

我没有在Windows上测试它,但here你可以获得小的初始化脚本,以便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/,俄语,或者我/某人可以根据需要为您翻译: - )。