Python 3.x phân biệt rõ ràng giữa các loại:
str
= = '...'
lít = một chuỗi các ký tự Unicode (UTF-16 hoặc UTF-32, tùy thuộc vào cách Python được biên dịch)
bytes
= b'...'
lít = một chuỗi các octet (số nguyên từ 0 đến 255)
Nếu bạn quen thuộc với Java hoặc C #, hãy nghĩ về str
as String
và bytes
as byte[]
. Nếu bạn quen với SQL, nghĩ str
như NVARCHAR
và bytes
như BINARY
hay BLOB
. Nếu bạn đã quen thuộc với Windows registry, nghĩ đến str
như REG_SZ
và bytes
như REG_BINARY
. Nếu bạn đã quen thuộc với C (++), thì hãy quên mọi thứ bạn đã học char
và chuỗi, bởi vì MỘT TÍNH NĂNG KHÔNG PHẢI LÀ BYTE . Ý tưởng đó đã lỗi thời.
Bạn sử dụng str
khi bạn muốn đại diện cho văn bản.
print('שלום עולם')
Bạn sử dụng bytes
khi bạn muốn biểu diễn dữ liệu nhị phân cấp thấp như cấu trúc.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Bạn có thể mã hóa a str
đến một bytes
đối tượng.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Và bạn có thể giải mã a bytes
thành a str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Nhưng bạn không thể tự do trộn lẫn hai loại.
>>> 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
Các b'...'
ký hiệu là hơi khó hiểu ở chỗ nó cho phép các byte 0x01-0x7F được xác định với các ký tự ASCII thay vì số hex.
>>> b'A' == b'\x41'
True
Nhưng tôi phải nhấn mạnh, một ký tự không phải là một byte .
>>> 'A' == b'A'
False
Trong Python 2.x
Các phiên bản Pre-3.0 của Python thiếu loại phân biệt giữa dữ liệu văn bản và dữ liệu nhị phân. Thay vào đó, đã có:
unicode
= u'...'
chữ = chuỗi ký tự Unicode = 3.xstr
str
= '...'
lít / chuỗi các byte / ký tự bị xáo trộn
- Thông thường văn bản, được mã hóa trong một số mã hóa không xác định.
- Nhưng cũng được sử dụng để đại diện cho dữ liệu nhị phân như
struct.pack
đầu ra.
Để giảm bớt quá trình chuyển đổi từ 2.x sang 3.x, b'...'
cú pháp bằng chữ đã được nhập vào Python 2.6, để cho phép phân biệt các chuỗi nhị phân (nên bytes
ở 3.x) với các chuỗi văn bản (nên str
ở trong 3 .x). Các b
tiền tố không có gì trong 2.x, nhưng kể2to3
kịch bản không để chuyển đổi nó thành một chuỗi Unicode trong 3.x.
Vì vậy, có, nghĩa b'...'
đen trong Python có cùng mục đích mà chúng làm trong PHP.
Ngoài ra, chỉ vì tò mò, có nhiều biểu tượng hơn b và u làm những việc khác không?
Các r
tiền tố tạo ra một chuỗi nguyên (ví dụ, r'\t'
là một dấu gạch chéo + t
thay vì một tab), và dấu ngoặc kép ba '''...'''
hoặc """..."""
cho phép nhiều dòng chuỗi literals.