簡體   English   中英

Python中字節到字符串的轉換似乎未按預期工作

[英]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應該是類似字節的對象 (例如bytesbytearray )。 在這種情況下,如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM