總是編碼從unicode到012字節的。
在這個方向上,你可以選擇編碼。
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
另一種方法是從字節解碼到unicode。
在這個方向上,你必須知道什麼編碼是。
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
這一點不能太強調。如果你想避免播放unicode「whack-a-mole」,那麼瞭解數據層面發生的事情很重要。這裏用另一種方式解釋:
- 一個unicode對象已經被解碼了,你永遠不會想要調用
decode
就可以了。
- 一個字符串對象已經被編碼了,你永遠不想調用
encode
就可以了。
現在,一個字節串看到.encode
,Python 2中首先嚐試隱式轉換爲文本(一unicode
對象)。同樣,在看到一個unicode字符串上的.decode
時,Python 2會隱式地嘗試將其轉換爲字節(str
對象)。
這些隱式轉換是爲什麼你可以得到Unicode
Decode
Error
當你叫encode
。這是因爲編碼通常接受unicode
類型的參數;當收到str
參數時,在用另一種編碼對其進行重新編碼之前,會對unicode
類型的對象進行隱式解碼。此轉換選擇默認的「ascii」解碼器,給您編碼器內部的解碼錯誤。
事實上,在Python 3的方法str.decode
和bytes.encode
甚至不存在。他們的撤除是一個[有爭議]的嘗試,以避免這種常見的混淆。
† ...或任何編碼sys.getdefaultencoding()
提及;通常這是 'ASCII'
來源
2012-03-10 05:14:14
wim
那麼解決方案是什麼?特別是如果我沒有字符串文字,我只是有一個字符串對象。 – 2013-03-12 07:57:52
@JonTirsen,你不應該編碼一個字符串對象。一個字符串對象已經被編碼。如果您需要更改編碼,則需要將其解碼爲一個unicode字符串,然後將其編碼爲所需的編碼。 – 2013-03-12 16:24:36
因此,從上面清楚地說明你可以''你好'.decode('utf-8')。encode('utf-8')' – deinonychusaur 2013-07-25 08:18:27