[英]Converting bytes to string with str() returns string with speech marks
說我有一個包含字節的變量:
>>> a = b'Hello World'
可以通過以下方式驗證:
>>> type(a)
<class 'bytes'>
現在,我嘗試使用str()
將a轉換為字符串:
>>> b = str(a)
並且肯定是一個字符串:
>>> type(b)
<class 'str'>
現在我嘗試打印b
但是得到了完全意外的結果:
>>> print(b)
b'Hello World'
就像我期望的那樣,它返回一個字符串,但它也保留b
(字節符號)和'
(引號)。
為什么這樣做,而不僅僅是在引號之間打印消息?
在某些默認的8位編碼中,不要將bytes
值視為字符串。 這只是二進制數據。 這樣, str(a)
返回一個與編碼無關的字符串,以表示字節字符串的值。 如果要使用'Hello World'
,請明確說明並解碼該值。
>>> b = a.decode()
>>> type(b)
>>> str
>>> print(b)
Hello World
在Python 2中,字節和文本之間的區別變得模糊。 Python 3竭盡全力將兩者分開: bytes
表示二進制數據,而str
表示可讀文本。
從另一個角度來看,比較
>>> list("Hello")
['H', 'e', 'l', 'l', 'o']
與
>>> list(b"Hello")
[72, 101, 108, 108, 111]
str(b)
所做的是通過嘗試調用thing.__str__
將字節轉換為字符串,這失敗,因為字節沒有__str__
,然后回__repr__
,后者返回在repl中創建此對象所需的字符串。
如果您考慮一下,將bytes
轉換為str
毫無意義,因為您需要了解編碼。 您可以使用bytes.decode(encoding)
將bytes
正確轉換為str
。
b.decode("utf-8")
編碼也可以保留為空,在這種情況下,將選擇默認值(可能是utf-8)。
str
通常將對象轉換為表示該對象的字符串。 沒有比b個對象包含字節對象更好的表示形式了。 您可能要使用decode
,在此您還指定bytes對象的編碼,在轉換為字符串時應使用
在Python 3.x中,當您使用str(s)
輸入字節字符串時,它會創建一個新字符串作為b'Hello World'
(在開頭保留"b"
表示字節字符串) 。 這是因為字節字符串沒有定義__str__
函數。 因此,它對__repr__
進行調用,該調用返回與用於表示其對象值的字節相同的字符串(即,字符串前面__repr__
“ b”)。 例如:
>>> a = b'Hello World'
>>> str(a)
"b'Hello World'"
有兩種方法可以將類似字節的對象轉換為字符串。 例如:
將字節字符串解碼為字符串 :您可以將字節字符串a
decode
為字符串:
>>> a.decode() 'Hello World'
將字節字符串轉換為utf-8
字符串,如下所示:
>>> str(a, 'utf-8') 'Hello World'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.