Các decode
phương pháp chuỗi unicode thực sự không có bất kì ứng dụng nào cả (trừ khi bạn có một số dữ liệu phi văn bản trong một chuỗi unicode vì một lý do - xem dưới đây). Nó chủ yếu ở đó vì lý do lịch sử, tôi nghĩ. Trong Python 3, nó hoàn toàn biến mất.
unicode().decode()
sẽ thực hiện một tiềm ẩn mã hóa của s
việc sử dụng mặc định (ascii) codec. Xác nhận điều này như vậy:
>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
>>> s.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
Các thông báo lỗi là hoàn toàn giống nhau.
Cho str().encode()
đó là cách khác xung quanh - nó cố gắng một tiềm ẩn giải mã của s
với mã hóa mặc định:
>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)
Được sử dụng như thế này, str().encode()
cũng là thừa.
Nhưng có một ứng dụng khác của phương thức sau rất hữu ích: có các mã hóa không liên quan gì đến các bộ ký tự và do đó có thể được áp dụng cho các chuỗi 8 bit theo cách có ý nghĩa:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
Mặc dù vậy, bạn đã đúng: việc sử dụng "mã hóa" mơ hồ cho cả hai ứng dụng này là ... tuyệt vời. Một lần nữa, với các loại byte
và string
loại riêng biệt trong Python 3, đây không còn là vấn đề nữa.