Nik*_*lai 6 python windows utf-8
让我们说吧
s = u"test\u0627\u0644\u0644\u0647 \u0623\u0643\u0628\u0631\u7206\u767A\u043E\u043B\u043E\u043B\u043E"
Run Code Online (Sandbox Code Playgroud)
如果我尝试直接打印,
>>> 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
Run Code Online (Sandbox Code Playgroud)
所以我在Python中将控制台更改为UTF-8(否则它将无法理解我的输入).
import win32console
win32console.SetConsoleOutputCP(65001)
win32console.SetConsoleCP(65001)
Run Code Online (Sandbox Code Playgroud)
然后输出编码为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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它会成功打印,直到它到达换行符,然后它会抛出IOError.
以下解决方法有效:
def safe_print(str):
try:
print str.encode('utf-8')
except:
pass
print
>>> safe_print(s)
test???? ???????????
Run Code Online (Sandbox Code Playgroud)
但必须有更好的方法.有什么建议?
我没有在Windows上测试它,但在这里你可以获得win/linux的小初始化脚本来正确设置输出编码,包括日志记录接口等。该模块还使输出彩色(包括“日志记录”接口的更新)?但你可以轻松地切断它不必要的功能:-)。
如何调用非彩色变体:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from setupcon import setup_console
setup_console('utf-8', False)
Run Code Online (Sandbox Code Playgroud)
和彩色变体:
import setupcon
setupcon.setup_console()
import logging
#...
if setupcon.ansi:
logging.getLogger().addHandler(setupcon.ColoredHandler())
Run Code Online (Sandbox Code Playgroud)
如果该解决方案适合您,您可以阅读此处的文档: http: //habrahabr.ru/blogs/python/117236/(俄语),或者我/某人可以根据需要为您翻译:-)。