[英]Bytes to string conversion in Python doesn't seem to work as expected
為什么在Python 3中會執行以下代碼
print(str(b"Hello"))
輸出b'Hello'
而不是常規文本字符串中的Hello
? 從最相關的二進制字符串類型創建str
對象看起來似乎是最終的,很容易的,這是違反直覺的。
在Python 3, bytes.__str__
沒有被定義 ,所以bytes.__repr__
來代替,當使用str()
的對象。 請注意, print()
還會對傳入的對象調用str()
,因此這里的調用完全是多余的。
如果您希望輸入文字,請顯式解碼:
print(b'Hello'.decode('ascii'))
str()
類型可以顯式處理bytes
對象,但前提是(再次)必須提供一個顯式編解碼器來首先解碼字節:
print(str(b'Hello', 'ascii'))
該文檔對此行為非常明確 :
如果既未給出編碼也未給出錯誤 ,則
str(object)
返回object.__str__()
,它是object.__str__()
的“非正式”或可很好打印的字符串表示形式。 對於字符串對象,這是字符串本身。 如果object沒有__str__()
方法,則str()
會返回返回repr(object)
。如果至少給出了編碼或錯誤之一,則object應該是類似字節的對象 (例如
bytes
或bytearray
)。 在這種情況下,如果object是一個bytes
(或bytearray
)對象,則str(bytes, encoding, errors)
等效於bytes.decode(encoding, errors)
。
和
在沒有編碼或錯誤參數的情況下將
bytes
對象傳遞給str()
屬於返回非正式字符串表示形式的第一種情況。
強調我的 。
您為什么要“起作用”? 一個bytes對象是一個bytes對象,它在Python 3中的字符串表示形式就是這種形式。 您可以將其內容轉換為適當的文本字符串(在Python3中-在Python2中為“ unicode”對象),您必須將其解碼為文本。
為此,您需要了解編碼-
請嘗試以下操作:
print(b"Hello".decode("latin-1"))
請注意假定的“ latin-1”文本編解碼器,它將把不在ASCII范圍(128-256)中的代碼透明地轉換為unicode。 Windows默認使用的編解碼器,用於西歐語言。
“ utf-8”編解碼器可以表示更大范圍的字符,並且是國際文本的首選編碼-但是,如果您的字節字符串未正確由utf-8字符組成,則在處理過程中可能會出現UnicodeDecode錯誤。
請閱讀http://www.joelonsoftware.com/articles/Unicode.html以正確理解有關文本的信息。
事先,對不起我的英語...
嘿,幾周前我遇到了這個問題。 就像上面的人所說的那樣。 如果解碼過程的異常無關緊要,這里有個提示。 在這種情況下,您可以使用:
bytesText.decode(textEncoding, 'ignore')
例如:
>>> b'text \xab text'.decode('utf-8', 'ignore') # Using UTF-8 is nice as you might know!
'text text' # As you can see, the « (\xab) symbol was
# ignored :D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.