Всегда encode от 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», важно понять, что происходит на уровне данных. Здесь объясняется еще один способ:
- Юникодный объект уже декодирован, вы никогда не хотите называть его
decode
.
- Объект bytestring уже закодирован, вы никогда не хотите называть его
encode
.
Теперь, видя .encode
на строку байтов, Python 2 сначала пытается неявно преобразовать его в текст (в unicode
объект). Аналогично, при просмотре .decode
в строке юникода Python 2 неявно пытается преобразовать его в байты (объект str
).
Эти неявные преобразования, почему вы можете получить Unicode
Decode
Error
, когда вы назвали encode
. Это потому, что кодировка обычно принимает параметр типа unicode
; при приеме параметра str
происходит неявное декодирование объекта типа unicode
перед повторным кодированием его с другой кодировкой. Это преобразование выбирает дешифратор «ascii» по умолчанию †, что дает вам ошибку декодирования внутри кодера.
Фактически, в Python 3 методы str.decode
и bytes.encode
даже не существуют. Их устранение было [противоречивой] попыткой избежать этой общей путаницы.
† ... или иное кодирование sys.getdefaultencoding()
упоминает; как правило, это 'ASCII'
Так в чем же решение? Особенно, если у меня нет строкового литерала, у меня просто есть строковый объект. –
@JonTirsen, вы не должны кодировать строковый объект. Строковый объект уже закодирован. Если вам нужно изменить кодировку, вам необходимо декодировать ее в строку юникода, а затем закодировать ее как нужную кодировку. –
Итак, чтобы четко сформулировать это, вы можете '' 你好 ".decode ('utf-8'). Encode ('utf-8')' – deinonychusaur