Завжди кодуйте від unicode до байтів.
У цьому напрямку ви можете вибрати кодування .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
Інший спосіб - декодувати від байтів до unicode.
У цьому напрямку ви повинні знати, що таке кодування .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Цей момент не може бути наголошений достатньо. Якщо ви хочете уникнути відтворення unicode "whack-a-mole", важливо зрозуміти, що відбувається на рівні даних. Тут це пояснено іншим способом:
- Об'єкт unicode вже розшифрований, ви ніколи не хочете його закликати
decode
.
- Об'єкт обстеження вже закодований, ви ніколи не хочете його зателефонувати
encode
.
Тепер, побачивши .encode
рядок байтів, Python 2 спочатку намагається неявно перетворити його в текст ( unicode
об'єкт). Аналогічно, побачивши .decode
в рядку unicode, Python 2 неявно намагається перетворити його в байти ( str
об'єкт).
Ці неявні перетворення - це те, чому ви можете отримати, коли вам дзвонили . Це тому, що кодування зазвичай приймає параметр типу ; при отриманні параметра існує неявне декодування в об'єкт типу перед повторним кодуванням його з іншим кодуванням. Ця конверсія вибирає декодер "ascii" за замовчуванням † , що дає вам помилку декодування всередині кодера.Unicode
Decode
Error
encode
unicode
str
unicode
Насправді в Python 3 методи str.decode
і bytes.encode
навіть не існують. Їх усунення було [суперечливою] спробою уникнути цієї загальної плутанини.
† ... або що інше sys.getdefaultencoding()
згадує кодування ; зазвичай це "ascii"