[英]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.