Как декодировать экранированные символы Unicode? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь заменить переведенные символы Юникода фактическими:

string = "\\u00c3\\u00a4"
print(string.encode().decode("unicode-escape"))

Ожидаемый вывод ä, фактический вывод ä.

1 Ответ

0 голосов
/ 23 сентября 2018

Я не уверен, каковы критерии @ melpomene для "знания того, что они делают", но следующее решение уже работало , например, для декодирования испорченного текста на иврите :

("\\u00c3\\u00a4"
  .encode('latin-1')
  .decode('unicode_escape')
  .encode('latin-1')
  .decode('utf-8')
)

Выходы:

'ä'

Это работает следующим образом:

  • Строка, содержащая только символы ascii '\', 'u', '0', '0', 'c' и т. Д. Преобразуется в байты с использованием некоторой не слишком сумасшедшей 8-битной кодировки (на самом деле не имеет значения, какая именно, если она правильно обрабатывает символы ASCII)
  • Использование декодеракоторый интерпретирует экранирование '\u00c3' как кодовую точку Unicode U + 00C3 (LATIN CAPITAL A LTERIN WITH TILDE, 'Ã').С точки зрения вашего кода, это бессмыслица, но эта кодовая точка Unicode имеет правильное представление байтов при повторном кодировании с ISO-8859-1 / 'latin-1', поэтому ...
  • закодируйте его снова с 'latin-1'
  • На этот раз «правильно» расшифруйте его, как UTF-8

Опять то же замечание, что и в связанном посте: прежде чем вкладывать слишком много энергии, пытаясь починить сломанный текст,вы можете попытаться исправить часть кода, которая выполняет кодирование, таким странным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...