答案 1
Python 3.x在类型之间做了明确的区分:
-
str
='...'
文本 = Unicode 字符序列(拉丁语-1、UCS-2 或 UCS-4,具体取决于字符串中最宽的字符)) -
bytes
=b'...'
文本 = 八位字节序列(介于 0 和 255 之间的整数)
如果您熟悉:
- Java 或 C#,可以这样想:和 as
str
String
bytes
byte[]
; - SQL,认为 as 和 as 或
str
NVARCHAR
bytes
BINARY
BLOB
; - Windows 注册表,可视为 和 .
str
REG_SZ
bytes
REG_BINARY
如果你熟悉 C(++),那就忘掉你所学到的一切和字符串,因为字符不是字节。这个想法早已过时。char
当您想要表示文本时使用。str
print('שלום עולם')
当您想要表示结构等低级二进制数据时,可以使用。bytes
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
您可以将 编码为对象。str
bytes
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
您可以将 a 解码为 .bytes
str
>>> 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'...'
bytes
str
b
2to3
所以,是的,Python中的文字与PHP中具有相同的目的。b'...'
另外,只是出于好奇,有没有比b和你更多的符号来做其他事情?
前缀创建一个原始字符串(例如,是反斜杠 +而不是制表符),并使用三重引号或允许多行字符串文本。r
r'\t'
t
'''...'''
"""..."""
答案 2
在Python 2中忽略“b”或“B”的前缀;它表示文本在Python 3中应成为字节文本(例如,当代码自动转换为2to3时)。“u”或“b”前缀后跟“r”前缀。
Python 3 文档指出:
字节文本始终以“b”或“B”为前缀;它们生成字节类型而不是 str 类型的实例。它们只能包含 ASCII 字符;数值为 128 或更大的字节必须用转义表示。
推荐