2011-08-16 32 views
6

比方說Python 2.7版:在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 

所以我改變控制檯爲UTF-8中的Python(否則它不會理解我的輸入)。

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

然後輸出編碼爲UTF-8,因爲Python不知道CHCP 65001是UTF-8(已知bug)的字符串。你可以看到,它成功打印,直到它碰到一個換行符,然後它拋出一個IOError。

以下變通辦法:

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

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

但是,必須有一個更好的辦法。有什麼建議麼?

+1

我希望你實際上不會調用'str'參數。避免陰影內建。 –

+0

@Chris:人們應該怎麼知道什麼是內建的,什麼不是?這是一件很自然的事情。如何保證乾淨的命名空間行爲,而不需要啓動的普遍知識? – tchrist

+0

但是,在這種情況下,它可能非常混亂,因爲'str'類型確實有一個編碼方法。 – agf

回答

1

我沒有在windows上測試它,但是here你可以得到一個小的初始化腳本,用於win/linux來正確設置輸出編碼,包括日誌接口等等。該模塊還使輸出變成彩色的(包括'logging '界面)?但你可以很容易地將它關掉:-)。

如何調用非彩色變種:

#!/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/,在俄羅斯,或者我/有人可以根據需要爲你翻譯它:-)。