Завжди кодуйте від 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" за замовчуванням † , що дає вам помилку декодування всередині кодера.UnicodeDecodeErrorencodeunicodestrunicode
Насправді в Python 3 методи str.decodeі bytes.encodeнавіть не існують. Їх усунення було [суперечливою] спробою уникнути цієї загальної плутанини.
† ... або що інше sys.getdefaultencoding()згадує кодування ; зазвичай це "ascii"