Python 3.x清楚地区分了以下类型:
str
='...'
字面量=Unicode字符序列(Latin-1、UCS-2或UCS-4,根据字符串中最宽的字符不同而定)
bytes
=b'...'
字面量=八位字节序列(0到255之间的整数)
如果您熟悉:
- Java或C#,则将
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为一个字节对象
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'...'
表示法有些令人困惑,因为它允许使用 ASCII 字符而不是十六进制数字来指定字节 0x01-0x7F。
>>> b'A' == b'\x41'
True
但是我必须强调,一个字符并不等同于一个字节。
>>> 'A' == b'A'
False
在Python 2.x中
Python的3.0之前版本没有文本和二进制数据之间的区别。相反,有:
unicode
= u'...'
字面值 = 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字符串。
所以,是的,在Python中b'...'
字面值具有与PHP中相同的目的。
另外,出于好奇,是否还有其他符号可以做其他事情?
< p >
r
前缀创建原始字符串(例如,< code>r'\t' 是反斜杠+< code>t 而不是制表符),三引号< code>'''...''' 或< code>"""...""" 允许多行字符串文字。
stringprefix
:: = "r" | "u" | "R" | "U" | "f" | "F" | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"bytesprefix
::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"。[文档:字符串和字节文字](https://docs.python.org/3/reference/lexical_analysis.html#literals) - AcK