Как преобразовать escape-последовательности Unicode в символы Unicode в строке python

Когда я попытался получить содержимое тега с помощью «unicode(head.contents[3])», я получил вывод, подобный этому: «Christensen Sk\xf6ld». Я хочу, чтобы escape-последовательность возвращалась в виде строки. Как это сделать на питоне?


person Vicky    schedule 13.06.2009    source источник


Ответы (3)


Предполагая, что Python видит имя как обычную строку, вам сначала нужно будет декодировать его в юникод:

>>> name
'Christensen Sk\xf6ld'
>>> unicode(name, 'latin-1')
u'Christensen Sk\xf6ld'

Другой способ добиться этого:

>>> name.decode('latin-1')
u'Christensen Sk\xf6ld'

Обратите внимание на «u» перед строкой, сигнализирующий о том, что она не закодирована. Если вы напечатаете это, буква с акцентом будет отображаться правильно:

>>> print name.decode('latin-1')
Christensen Sköld

Кстати: при необходимости вы можете использовать метод «кодирования», чтобы превратить юникод, например, в. строка UTF-8:

>>> name.decode('latin-1').encode('utf-8')
'Christensen Sk\xc3\xb6ld'
person Mark van Lent    schedule 14.06.2009
comment
большое спасибо чувак. Так что, если мне нужно сохранить его в базе данных, я могу декодировать его и сохранить в базе данных, верно? - person Vicky; 14.06.2009
comment
НЕТ, прочитайте еще раз пример Марка. После декодирования данных из чего бы то ни было (latin1, cp1252 и т. д.) в юникод вам необходимо закодировать строку юникода с помощью кодировки, которая (1) поддерживается вашей базой данных и (2) сохраняет все символы юникода... обычно UTF-8 . - person John Machin; 15.06.2009

Учитывая строку байтов с экранами Unicode b"\N{SNOWMAN}", b"\N{SNOWMAN}".decode('unicode-escape) создаст ожидаемую строку Unicode u'\u2603'.

person joeforker    schedule 23.08.2012
comment
хотя это и не совсем ответ на вопрос, это правильный ответ, когда вы получаете строки, закодированные как '\ u00e9' - person Tshirtman; 27.11.2019

Я подозреваю, что это действительно работает правильно. По умолчанию Python отображает строки в кодировке ASCII, поскольку не все терминалы поддерживают юникод. Однако, если вы на самом деле печатаете строку, она должна работать. См. следующий пример:

>>> u'\xcfa'
u'\xcfa'
>>> print u'\xcfa'
Ïa
person BJ Homer    schedule 13.06.2009
comment
Если проблема связана с терминалом, будет ли он отображаться правильно, если я сохраню его в базе данных (MySQL)?? - person Vicky; 14.06.2009
comment
Да, это будет, но вы должны позаботиться о кодировке сортировки/набора символов вашей БД. - person securecurve; 04.12.2012