繁体   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