Как мне трактовать строку ASCII как юникод и убирать экранированные символы в ней в python? - PullRequest
26 голосов
/ 06 ноября 2008

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

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

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

'\u003foo\u003e'

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

'<foo/>'

Ответы [ 5 ]

45 голосов
/ 06 ноября 2008

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

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

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

РЕДАКТИРОВАТЬ: См. Также Стандартные кодировки Python .

2 голосов
/ 01 июля 2012

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

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

>>> 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]

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

1 голос
/ 29 марта 2014

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

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

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

>>> s = '\u003cfoo\u003e'
>>> s.decode( 'unicode-escape' ).encode( 'utf-8' )
>>> <foo>
1 голос
/ 17 ноября 2009

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

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

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

0 голосов
/ 06 ноября 2008

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

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