Python 3.x使得类型之间有明显的区别:
str
= '...'
文字= Unicode字符(UTF-16或UTF-32,这取决于Python的是如何被编译)
bytes
的序列= b'...'
文字=八位字节序列
如果你熟悉Java或C#(0和255之间的整数),认为str
为String
和bytes
作为byte[]
。如果你熟悉SQL,认为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]
您可以encode一个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'...'
文字= Unicode字符序列= 3.x的str
str
= '...'
文字=混杂字节序列/字符
- 一般文本,在一些编码未指定的编码。
- 但也用于表示像
struct.pack
输出的二进制数据。
为了缓解在2.x到3.x的过渡中,b'...'
文本语法被反向移植到Python 2.6,以便允许区分二进制字符串(这应该是在3 bytes
。 x)来自文本字符串(在3.x中应该是str
)。前缀b
在2.x中不做任何处理,但会告知2to3
脚本不要将其转换为3.x中的Unicode字符串。
所以是的,b'...'
Python中的文字与PHP中的文字具有相同的用途。
而且,只是出于好奇,有没有 比B和U更多的符号是做其他事情 ?
的r
前缀创建原始字符串(例如,r'\t'
是反斜杠+ t
代替标签),和三引号'''...'''
或"""..."""
允许多行字符串文字。
所以它听起来像Python
2011-06-07 19:05:18
@Gweebz - 如果你真的用特定的编码输入一个字符串,而不是使用unicode转义(例如,'b'\ xff \ xfe \ xe12'而不是'\ u32e1')。 – detly 2011-06-08 02:44:49
这是有道理的。我将把这个标记为公认的答案,但这里也有其他的好答案! – 2011-06-08 14:15:36