Zawsze koduj od Unicode do bajtów.
W tym kierunku możesz wybrać kodowanie .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
Innym sposobem jest dekodowanie z bajtów do Unicode.
W tym kierunku musisz wiedzieć, jakie jest kodowanie .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Nie można tego wystarczająco podkreślić. Jeśli chcesz uniknąć grania w Unicode „whack-a-mole”, ważne jest, aby zrozumieć, co dzieje się na poziomie danych. Tutaj jest wyjaśnione w inny sposób:
- Obiekt Unicode został już zdekodowany, nigdy nie chcesz go wywoływać
decode
.
- Obiekt bytestring jest już zakodowany, nigdy nie chcesz go wywoływać
encode
.
Teraz, widząc .encode
ciąg bajtów, Python 2 najpierw próbuje niejawnie przekonwertować go na tekst ( unicode
obiekt). Podobnie, widząc .decode
ciąg znaków Unicode, Python 2 niejawnie próbuje przekonwertować go na bajty ( str
obiekt).
Te niejawne konwersje są powodem, dla którego możesz uzyskać, gdy zadzwonisz . Dzieje się tak, ponieważ kodowanie zwykle akceptuje parametr typu ; podczas odbierania parametru następuje niejawne dekodowanie do obiektu typu przed ponownym zakodowaniem go za pomocą innego kodowania. Ta konwersja wybiera domyślny dekoder „ascii” † , podając błąd dekodowania wewnątrz kodera.Unicode
Decode
Error
encode
unicode
str
unicode
W rzeczywistości w Pythonie 3 metody str.decode
i bytes.encode
nawet nie istnieją. Ich usunięcie było [kontrowersyjną] próbą uniknięcia tego powszechnego zamieszania.
† ... lub cokolwiek sys.getdefaultencoding()
wspomina kod; zwykle jest to „ascii”