簡體   English   中英

使用str()將字節轉換為字符串會返回帶有語音標記的字符串

[英]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'"

有兩種方法可以將類似字節的對象轉換為字符串。 例如:

  1. 將字節字符串解碼為字符串 :您可以將字節字符串a decode為字符串:

     >>> a.decode() 'Hello World' 
  2. 將字節字符串轉換為utf-8字符串,如下所示:

     >>> str(a, 'utf-8') 'Hello World' 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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