Luôn mã hóa từ unicode sang byte.
Theo hướng này, bạn có thể chọn mã hóa .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
Cách khác là giải mã từ byte sang unicode.
Theo hướng này, bạn phải biết mã hóa là gì .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Điểm này không thể đủ căng thẳng. Nếu bạn muốn tránh chơi unicode "whack-a-nốt ruồi", điều quan trọng là phải hiểu những gì đang xảy ra ở cấp dữ liệu. Ở đây nó được giải thích theo một cách khác:
- Một đối tượng unicode đã được giải mã rồi, bạn không bao giờ muốn gọi
decode
nó.
- Một đối tượng bytestring đã được mã hóa sẵn, bạn không bao giờ muốn gọi
encode
nó.
Bây giờ, khi nhìn thấy .encode
một chuỗi byte, Python 2 trước tiên cố gắng chuyển đổi nó thành văn bản (một unicode
đối tượng) một cách hoàn toàn . Tương tự, khi nhìn thấy .decode
trên một chuỗi unicode, Python 2 cố gắng chuyển đổi nó thành byte (một str
đối tượng) một cách ngầm định .
Những chuyển đổi ngầm này là lý do tại sao bạn có thể nhận được khi bạn đã gọi . Đó là bởi vì mã hóa thường chấp nhận một tham số kiểu ; khi nhận một tham số, sẽ có một giải mã ngầm thành một đối tượng kiểu trước khi mã hóa lại nó bằng một mã hóa khác. Chuyển đổi này chọn một bộ giải mã 'ascii' mặc định † , cho bạn lỗi giải mã bên trong bộ mã hóa.Unicode
Decode
Error
encode
unicode
str
unicode
Trên thực tế, trong Python 3, các phương thức str.decode
và bytes.encode
thậm chí không tồn tại. Việc loại bỏ họ là một nỗ lực [gây tranh cãi] để tránh sự nhầm lẫn phổ biến này.
† ... hoặc bất kỳ sys.getdefaultencoding()
đề cập mã hóa nào ; thường thì đây là 'ascii'