Есть много вопросов о преобразовании utf-8> unicode, но я до сих пор не нашел ответа на свою проблему.
У нас есть такие строки:
a = "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"
Python 3.6 понимает эту строку как Je-li pro za \ xc5 \ x99azov \ xc3 \ xa1n \ xc3 \ xad. Мне нужно преобразовать эту строку, похожую на utf-8, в представление Unicode. Конечный результат должен быть Je-li pro zařazování.
С a.decode("utf-8") я получаю AttributeError: объект 'str' не имеет атрибута 'decode', потому что Python означает, что объект уже декодирован.
Если я сначала конвертирую его в байты с помощью bytes(a, "utf-8"), обратные косые черты удваиваются, и .decode("utf-8") снова возвращает его в мой текущий a.
Как получить строку юникода Je-li pro zařazování с этого a?
И ... почему у вас два \?
Почему две обратные косые черты ... Это результат одного странного API, который возвращает некоторые символы в декодированном виде, а некоторые нет.





Вам нужно 4 раза кодировать / декодировать, чтобы получить желаемый результат:
print(
"Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"
# actually any encoding support printable ASCII would work, for example utf-8
.encode('ascii')
# unescape the string
# source: https://stackoverflow.com/a/1885197
.decode('unicode-escape')
# latin-1 also works, see https://stackoverflow.com/q/7048745
.encode('iso-8859-1')
# finally
.decode('utf-8')
)
Кроме того, подумайте о том, чтобы указать целевой программе (источнику данных) другой формат вывода (например, массив байтов или кодировку base64), если можете.
Небезопасный, но более короткий путь:
st = "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"
print(eval("b'"+st+"'").decode('utf-8'))
Есть ast.literal_eval, но, возможно, здесь его не стоит использовать.
Не помогает это? (и прежде чем вы скажете «нет, это не так», он не использует
bytes(a,"utf-8"), вам нужно более подробное объяснение.)