'b'字符在字符串前面做了什么?

显然,以下是有效的语法

my_string = b'The string'

我想知道:

  • 字符串前面的这个b字符是什么意思?
  • 使用它有什么影响?
  • 什么是适当的情况下使用它?
  • 我在SO上发现了一个相关的问题,但是这个问题与PHP相关,并且它指出b用于表示字符串是二进制的,而不是Unicode,这是代码与PHP版本兼容所需的< 6,迁移到PHP 6.我不认为这适用于Python。

    我在Python网站上找到了关于在相同语法中使用u字符来指定字符串为Unicode的文档。 不幸的是,它没有提到该文档中任何地方的b字符。

    另外,出于好奇,除了bu之外,还有其他符号吗?


    引用Python 2.x文档:

    在Python 2中忽略'b'或'B'的前缀; 它表明文字应该成为Python 3中的字节文字(例如,当代码自动转换为2to3时)。 'u'或'b'前缀可以后跟'r'前缀。

    Python 3.3文档指出:

    字节文字总是以'b'或'B'作为前缀; 它们会生成字节类型的实例,而不是str类型。 它们可能只包含ASCII字符; 数值为128或更大的字节必须用转义符表示。


    Python 3.x明确区分了两种类型:

  • str = '...'文字=一系列Unicode字符(UTF-16或UTF-32,取决于Python编译的方式)
  • bytes = b'...'文字=一串八位字节(0到255之间的整数)
  • 如果您熟悉Java或C#,请将str看作String ,将bytes看作byte[] 。 如果您熟悉SQL,请将str视为NVARCHAR ,将bytes视为BINARYBLOB 。 如果您熟悉Windows注册表,请将str视为REG_SZ ,将bytes视为REG_BINARY 。 如果你熟悉C(++),那么忘记你所学到的关于char和字符串的所有东西,因为字符不是字节 。 这个想法已经过时了很久。

    当你想表达文字时你使用str

    print('שלום עולם')
    

    当你想表示像结构体这样的低级二进制数据时,你使用bytes

    NaN = struct.unpack('>d', b'xffxf8x00x00x00x00x00x00')[0]
    

    您可以将str编码为一个bytes对象。

    >>> 'uFEFF'.encode('UTF-8')
    b'xefxbbxbf'
    

    你可以将一个bytes解码为一个str

    >>> b'xE2x82xAC'.decode('UTF-8')
    '€'
    

    但是你不能自由混合这两种类型。

    >>> b'xEFxBBxBF' + 'Text with a UTF-8 BOM'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can't concat bytes to str
    

    b'...'符号有点令人困惑,因为它允许用ASCII字符而不是十六进制数字来指定字节0x01-0x7F。

    >>> b'A' == b'x41'
    True
    

    但我必须强调, 一个角色不是一个字节

    >>> 'A' == b'A'
    False
    

    在Python 2.x中

    Python 3.0之前的版本缺少文本和二进制数据之间的这种区别。 相反,有:

  • unicode = u'...' literals = Unicode字符序列= 3.x str
  • str = '...'文字=混杂字节/字符的序列
  • 通常是以某种未指定编码编码的文本。
  • 但也用于表示二进制数据,如struct.pack输出。
  • 为了缓解2.x到3.x的转换, b'...'文字语法被反向移植到Python 2.6,以允许区分文本中的二进制字符串(应该是3.x中的bytes )字符串(应该是3.x中的str )。 b前缀在2.x中不做任何事情,但是告诉2to3脚本不要将它转换为3.x中的Unicode字符串。

    所以是的, b'...'文字与PHP中b'...'文字具有相同的目的。

    另外,出于好奇,除了b和u之外,还有其他符号吗?

    r前缀创建一个原始字符串(例如, r't'是一个反斜杠+ t而不是一个制表符),而三重引号'''...'''或者"""..."""允许多线字符串文字。


    b表示一个字节串。

    字节是实际数据。 字符串是一个抽象。

    如果你有多字符的字符串对象,并且你接受了一个字符,那么它将是一个字符串,并且它的大小可能会超过1个字节,具体取决于编码。

    如果使用一个字节字符串占用1个字节,您将从0-255获得一个8位值,如果由于编码导致这些字符> 1个字节,则它可能不会表示完整字符。

    TBH我会使用字符串,除非我有一些特定的低级别原因使用字节。

    链接地址: http://www.djcxy.com/p/53093.html

    上一篇: What does the 'b' character do in front of a string literal?

    下一篇: Is it pythonic for a function to return multiple values?