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

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

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

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

 '\u003foo\u003e' 

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

 '<foo/>' 

5 Solutions collect form web for “Как обрабатывать строку ASCII как unicode и unescape экранированные символы в ней в python?”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 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> 

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

 >>> s = '\u003cfoo\u003e' >>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii') '<foo>' 
  • Как проверить, находится ли строка в Python в ASCII?
  • json.loads () возвращает объект unicode вместо словаря
  • Написание текста с диакритическим («nikud», отметки вокализации) с использованием PIL (Python Imaging Library)
  • Python 3 smtplib отправляет с символами unicode
  • Отсутствуют кодеки Unicode на kivy / Python на Android?
  • Unsuppress UnicodeEncodeError исключения при запуске из Aptana Studio PyDev
  • Как юникод представлен внутри Python?
  • Преобразование CSV в YAML, с Unicode?
  • Проверьте строку, если это Юникод, какой стандарт UTF и длина его в байтах?
  • Преобразование в Emoji
  • Python 2.7.2: plistlib с itunes xml
  • Python - лучший язык программирования в мире.