比方說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الله أكبر爆発ололо
但是,必須有一個更好的辦法。有什麼建議麼?
我希望你實際上不會調用'str'參數。避免陰影內建。 –
@Chris:人們應該怎麼知道什麼是內建的,什麼不是?這是一件很自然的事情。如何保證乾淨的命名空間行爲,而不需要啓動的普遍知識? – tchrist
但是,在這種情況下,它可能非常混亂,因爲'str'類型確實有一個編碼方法。 – agf