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

6 投票
2 回答
5517 浏览
提问于 2025-04-16 23:41

假设我们有这样的情况:

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 个回答

1

我没有在Windows上测试过,但你可以在这里找到一个小的初始化脚本,适用于Windows和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/,是俄文的,或者我/其他人可以根据需要为你翻译 :-)。

4

在StackOverflow上搜索 python utf8 windows,第一个结果是一个问题,链接是 如何让Python在Windows XP的控制台中以UTF8格式打印。这个问题讲述了在Windows上用Python打印UTF8时遇到的困难。

撰写回答