Например, если у меня есть строка юникод, я могу закодировать ее как строку ASCII следующим образом:
>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'
Однако у меня, например, эта строка ASCII:
'\u003foo\u003e'
... которую я хочу преобразовать в ту же строку ASCII, что и в моем первом примере выше:
'<foo/>'






Это немного опасно в зависимости от того, откуда идет строка, но как насчет:
>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'
Мне потребовалось время, чтобы понять это, но эта страница дал лучший ответ:
>>> 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/…
В 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 кавычками.
Таким образом, не нужно беспокоиться о том, что вводят пользователи, если это записано в необработанном формате.
В какой-то момент вы столкнетесь с проблемами, когда встретите специальные символы, такие как китайские символы или смайлики, в строке, которую хотите декодировать, то есть ошибки, которые выглядят следующим образом:
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>
К сожалению, наш вклад поступает от пользователей, поэтому это было бы слишком опасно для нас.