代码之家  ›  专栏  ›  技术社区  ›  Xantium

使用str()将字节转换为字符串将返回带有语音标记的字符串

  •  1
  • Xantium  · 技术社区  · 7 年前

    假设我有一个包含字节的变量:

    >>> a = b'Hello World'
    

    可通过以下方式进行验证:

    >>> type(a)
    <class 'bytes'>
    

    现在,我尝试将a转换为字符串 str() :

    >>> b = str(a)
    

    这确实是一个字符串:

    >>> type(b)
    <class 'str'>
    

    现在我尝试打印 b 但我得到了一个完全出乎意料的结果:

    >>> print(b)
    b'Hello World'
    

    正如我所料,它返回一个字符串,但它还保留 B (字节符号)和 ' (引号)。

    为什么它会这样做,而不仅仅是在引号之间打印消息?

    4 回复  |  直到 7 年前
        1
  •  5
  •   chepner    7 年前

    不要想 bytes 在某些默认8位编码中作为字符串的值。这只是二进制数据。像这样的 str(a) 返回表示字节字符串值的编码无关字符串。如果你愿意 'Hello World' ,并对值进行解码。

    >>> b = a.decode()
    >>> type(b)
    >>> str
    >>> print(b)
    Hello World
    

    在Python 2中,字节和文本之间的区别是模糊的。Python 3竭尽全力将两者分开: 字节数 对于二进制数据,以及 str 用于可读文本。

    另一方面,请比较

    >>> list("Hello")
    ['H', 'e', 'l', 'l', 'o']
    

    具有

    >>> list(b"Hello")
    [72, 101, 108, 108, 111]
    
        2
  •  3
  •   Azsgy    7 年前

    什么 str(b) 这里是否通过尝试调用 thing.__str__ ,由于字节没有 __str__ 然后回到 __repr__ ,它返回在repl中创建此对象所需的字符串。

    如果你想一想,就转换一下 bytes 到a str 没有什么意义,因为您需要知道编码。您可以使用 bytes.decode(encoding) 要转换 字节数 str公司 正确地

    b.decode("utf-8")
    

    编码也可以保留为空,在这种情况下,将选择默认值(可能是utf-8)。

        3
  •  0
  •   TomáÅ¡ Zahradníček    7 年前

    str 通常将对象转换为表示它的字符串。没有比字节对象的b'contains'更好的表示了。您可能想使用 decode ,其中还指定字节对象的编码,转换为字符串时应使用该编码

        4
  •  0
  •   Moinuddin Quadri    7 年前

    在Python 3中。x、 使用键入强制转换字节字符串时 str(s) ,它将创建一个新字符串,如下所示 b'Hello World' (保留 "b" 表示起始处的字节字符串) 。这是因为字节字符串没有 __str__ 定义的函数。因此,它呼吁 __repr__ 它返回用于表示其对象值的字节所使用的相同字符串(即前面有“b”的字符串)。例如:

    >>> a = b'Hello World'
    >>> str(a)
    "b'Hello World'"
    

    有两种方法可以将类似字节的对象转换为字符串。例如:

    1. 将字节字符串解码为字符串 :您可以 decode 您的字节字符串 a 字符串形式:

      >>> a.decode()
      'Hello World'
      
    2. 将字节字符串转换为 utf-8 一串 作为:

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