Как мне обработать строку ASCII как unicode и отменить экранирование в ней экранированных символов в python?

Например, если у меня есть строка юникод, я могу закодировать ее как строку ASCII следующим образом:

>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'

Однако у меня, например, эта строка ASCII:

'\u003foo\u003e'

... которую я хочу преобразовать в ту же строку ASCII, что и в моем первом примере выше:

'<foo/>'
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
29
0
20 222
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Это немного опасно в зависимости от того, откуда идет строка, но как насчет:

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'

К сожалению, наш вклад поступает от пользователей, поэтому это было бы слишком опасно для нас.

John 06.11.2008 05:32
Ответ принят как подходящий

Мне потребовалось время, чтобы понять это, но эта страница дал лучший ответ:

>>> s = '\u003cfoo/\u003e'
>>> s.decode( 'unicode-escape' )
u'<foo/>'
>>> s.decode( 'unicode-escape' ).encode( 'ascii' )
'<foo/>'

Также существует кодек 'raw-unicode-escape' для обработки другого способа указания строк Unicode - проверьте раздел «Конструкторы Unicode» на связанной странице для получения дополнительных сведений (поскольку я не такой, как Unicode-saavy).

Обновлено: см. Также Стандартные кодировки Python.

Обратите внимание, что это применимо только к Python 2. В Python 3 все строки являются объектами Unicode stackoverflow.com/questions/28583565/…

Guido 21.08.2018 15:07

В Python 2.5 правильная кодировка - unicode_escape, а не unicode-escape (обратите внимание на подчеркивание).

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

Во всяком случае, вот оно.

Нед Батчелдер сказал:

It's a little dangerous depending on where the string is coming from, but how about:

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'

На самом деле сделать этот метод безопасным можно так:

>>> s = '\u003cfoo\u003e'
>>> s_unescaped = eval('u"""'+s.replace('"', r'\"')+'-"""')[:-1]

Обратите внимание на строку с тройными кавычками и тире прямо перед закрывающими 3 кавычками.

  1. Использование строки в трех кавычках гарантирует, что если пользователь введет '\\ "' (пробелы, добавленные для наглядности) в строке, это не нарушит работу оценщика;
  2. Тире в конце является отказоустойчивым в случае, если строка пользователя заканчивается на '\ "'. Перед тем, как присвоить результат, мы разрезаем вставленное тире с помощью [: -1]

Таким образом, не нужно беспокоиться о том, что вводят пользователи, если это записано в необработанном формате.

В какой-то момент вы столкнетесь с проблемами, когда встретите специальные символы, такие как китайские символы или смайлики, в строке, которую хотите декодировать, то есть ошибки, которые выглядят следующим образом:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-123: ordinal not in range(128)

В моем случае (обработка данных twitter) я декодировал следующим образом, чтобы я мог видеть все символы без ошибок.

>>> s = '\u003cfoo\u003e'
>>> s.decode( 'unicode-escape' ).encode( 'utf-8' )
>>> <foo>

Другие вопросы по теме