Преобразование последовательности Unicode UTF-8 в символы UTF-8 в Python 3 - PullRequest
0 голосов
/ 27 февраля 2019

Я читаю данные из корзины aws s3, в которой символы Юникода экранированы двойными обратными слешами.

Двойная обратная косая черта делает последовательность Юникода анализируемой как последовательность символов utf-8 вместо символакоторый представляет Unicode.

Пример иллюстрирует ситуацию.

>>> s1="1+1\\u003d2"
>>> print(s1)
1+1\u003d2

Фактическая последовательность Unicode в этом случае будет знаком равенства.

>>> s2="1+1\u003d2"
>>> print(s2)
1+1=2

Есть лиспособ преобразования последовательности символа utf-8 в первом примере так, чтобы строка, представленная s1, была проанализирована с ее последовательностью unicode как фактическим знаком utf-8, который она представляет?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я также добавляю вариант решения juanpa.arrivillaga, который также обрабатывает суррогатное спасение.

>>> import codecs
>>> s1="A surrogate sequence \\ud808\\udf45"
>>> print(codecs.decode(s1, encoding='unicode_escape'))
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 21-22: surrogates not allowed
>>> print(codecs.decode(s1,encoding='unicode_escape',errors='surrogateescape').encode('utf-16', 'surrogatepass').decode('utf-16'))
A surrogate sequence ?
0 голосов
/ 27 февраля 2019

Я полагаю, что модуль codecs предоставляет эту утилиту:

>>> import codecs
>>> codecs.decode("1+1\\u003d2", encoding='unicode_escape')
'1+1=2'

Это, вероятно, указывает на более серьезную проблему.Как эти строки оказываются на первом месте?

Обратите внимание: если это извлекается из допустимой строки JSON (в этом случае в ней отсутствуют кавычки), вы можете просто использовать:

>>> import json
>>> json.loads('"1+1\\u003d2"')
'1+1=2'
...