Python 3。X明确区分了这两种类型:
STR = '…' literals = Unicode字符序列(Latin-1, UCS-2或UCS-4,取决于字符串中最宽的字符)
Bytes = b'…' literals =一个字节序列(0到255之间的整数)
如果你熟悉:
Java或c#,将str视为String,将bytes视为byte[];
SQL,把str看成NVARCHAR,字节看成BINARY或BLOB;
Windows注册表,将str视为REG_SZ, bytes视为REG_BINARY。
如果您熟悉C(++),那么请忘记您所学的关于char和字符串的所有内容,因为字符不是字节。这种想法早就过时了。
当你想要表示文本时,可以使用str。
print('שלום עולם')
当您希望表示低级二进制数据(如结构体)时,可以使用字节。
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
可以将str编码为bytes对象。
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
你可以把一个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
b”……'符号有点令人困惑,因为它允许字节0x01-0x7F用ASCII字符而不是十六进制数字指定。
>>> b'A' == b'\x41'
True
但我必须强调,字符不是字节。
>>> 'A' == b'A'
False
Python 2.x
3.0之前版本的Python缺乏这种文本和二进制数据之间的区别。取而代之的是:
Unicode = u'…' literals = Unicode字符序列= 3。x str
STR = '…' literals =混乱的字节/字符序列
通常是文本,用某种未指定的编码方式编码。
但也用于表示二进制数据,如struct。包输出。
为了简化2.x到3。X跃迁,b'…的文字语法被回移植到Python 2.6,以便允许区分二进制字符串(在3.x中应该是字节)和文本字符串(在3.x中应该是str)。前缀b在2中没有任何作用。但是告诉2to3脚本不要将它转换为3.x中的Unicode字符串。
所以是的,b'…'字面值在Python中与在PHP中具有相同的目的。
另外,出于好奇,它们都在那里
比b和u更多的符号
其他事情吗?
前缀r创建一个原始字符串(例如,r'\t'是一个反斜杠+ t而不是制表符),以及三引号" '…" '或"""…"""允许多行字符串字面量。