“b”字符在字符串文本前面有什么作用?在 Python 2.x 中

2022-09-05 01:01:18

显然,以下是有效的语法:

b'The string'

我想知道:

  1. 字符串前面的这个字符是什么意思?b
  2. 使用它有什么效果?
  3. 在什么情况下使用它?

我在SO上发现了一个相关的问题,但这个问题是关于PHP的,它指出用于指示字符串是二进制的,而不是Unicode,Unicode在迁移到PHP 6时需要代码与PHP < 6版本兼容。我不认为这适用于Python。b

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

另外,只是出于好奇,有没有比做其他事情的符号更多的符号?bu


答案 1

Python 3.x在类型之间做了明确的区分:

如果您熟悉:

  • Java 或 C#,可以这样想:和 asstrStringbytesbyte[];
  • SQL,认为 as 和 as 或strNVARCHARbytesBINARYBLOB;
  • Windows 注册表,可视为 和 .strREG_SZbytesREG_BINARY

如果你熟悉 C(++),那就忘掉你所学到的一切和字符串,因为字符不是字节。这个想法早已过时。char

当您想要表示文本时使用。str

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

当您想要表示结构等低级二进制数据时,可以使用。bytes

NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]

您可以将 编码为对象。strbytes

>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'

您可以将 a 解码为 .bytesstr

>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'

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

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

这种表示法有些令人困惑,因为它允许用ASCII字符而不是十六进制数字指定0x01 0x7F字节。b'...'

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

但我必须强调,字符不是字节

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

在 Python 2.x 中

3.0之前的Python版本缺乏文本和二进制数据之间的这种区别。取而代之的是:

  • unicode = u'...'文本 = Unicode 字符序列 = 3.xstr
  • str = '...'文本 = 混杂字节/字符的序列
    • 通常是文本,以一些未指定的编码进行编码。
    • 但也用于表示二进制数据,如输出。struct.pack

为了简化 2.x 到 3.x 的转换,文本语法被反向移植到 Python 2.6,以便允许区分二进制字符串(应该在 3.x 中)和文本字符串(应该在 3.x 中)。前缀在 2.x 中不执行任何操作,但告诉脚本不要将其转换为 3.x 中的 Unicode 字符串。b'...'bytesstrb2to3

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

另外,只是出于好奇,有没有比b和你更多的符号来做其他事情?

前缀创建一个原始字符串(例如,是反斜杠 +而不是制表符),并使用三重引号或允许多行字符串文本。rr'\t't'''...'''"""..."""


答案 2

引用 Python 2.x 文档:

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

Python 3 文档指出:

字节文本始终以“b”或“B”为前缀;它们生成字节类型而不是 str 类型的实例。它们只能包含 ASCII 字符;数值为 128 或更大的字节必须用转义表示。