2015-09-24 203 views
0

以下是我觀察到的一些情況。想知道爲什麼Python的打印行爲是這樣的,並且可能的修復。Python打印無法同時打印Unicode和字符串

>>> print "%s" % u"abc" # works 
>>> print "%s" % "\xd1\x81" # works 
>>> print "%s %s" % (u"abc", "\xd1\x81") # Error 

對於上述(最後),我得到:UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128)

但是,這個工作

>>> print "%s %s" % ("abc", "\xd17\x81") # works 

當我做

>>> print "%s %s" % (u"abc", u"\u0441") # Error 

其提高UnicodeEncodeError: 'charmap' codec can't encode character u'\u0441' in position 4: character maps to <undefined>

回答

0

這是正確的。輸出時,必須將unicode對象編碼爲所需的字符編碼,即utf-8或其他。將unicode(包括所有文字)作爲一個抽象,必須在序列化之前編碼爲類似utf-8的東西。

您可以編碼unicode對象sutf-8s.encode('utf-8')str Python 2中的對象是字節編碼的,因此您不會遇到類似「\ xd17 \ 81」的錯誤,它們已經被編碼。

我建議你使用Python 3而不是Python 2,這樣更直觀。

2

當您在Python 2中混合使用Unicode字符串和字節字符串時,使用默認ascii編解碼器將字節字符串隱式強制爲Unicode。如果失敗,您將獲得UnicodeDecodeError

當您打印Unicode字符串時,它們隱式編碼爲當前輸出編碼。如果失敗,您將得到UnicodeEncodeError

所以:

>>> print "%s" % u"abc" 

是真的:

>>> print unicode("%s",'ascii') % u"abc" # and valid 

但如果你的意思是隻有以下工作 「不會引發錯誤」。如果您希望打印U + 0441字符,則只有在輸出編碼爲UTF-8時纔會這樣做。它在我的Windows系統上打印垃圾。

>>> print "%s" % "\xd1\x81" 

以下給出,因爲隱式的Unicode解碼的誤差:

print "%s %s" % (u"abc", "\xd1\x81") 

這是真的:

print unicode("%s %s",'ascii') % (u"abc", unicode("\xd1\x81",'ascii')) 

\xd10x81是0-7Fh的ASCII範圍之外。

最後一個錯誤意味着您的輸出編碼不是UTF-8,因爲它無法將\u0441編碼爲打印輸出編碼支持的字符。 UTF-8可以編碼所有Unicode字符。

+0

你應該強調:「不要混合Unicode和字節串」 – jfs