Como faço para tratar uma string ASCII como unicode e unescape os caracteres de escape nele em python?

StackOverflow https://stackoverflow.com/questions/267436

  •  06-07-2019
  •  | 
  •  

Pergunta

Por exemplo, se eu tenho um unicode string, posso codificá-lo como um ASCII string assim:

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

No entanto, tenho por exemplo este ASCII string:

'\u003foo\u003e'

... que eu quero transformar no mesmo ASCII string como no meu primeiro exemplo acima:

'<foo/>'
Foi útil?

Solução

Levei um tempo para descobrir isso, mas esta página teve a melhor resposta:

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

Há também um '-unicode-escape raw' codec para lidar com a outra maneira de especificar cadeias de caracteres Unicode - confira a seção "Unicode Construtores" da página do link para mais detalhes (desde que eu não sou tão Unicode-saavy) .

EDIT: Veja também Python padrão Encodings .

Outras dicas

Ned Batchelder disse:

É um pouco perigoso, dependendo de onde a corda está vindo, mas como sobre: ??

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

Na verdade, este método pode ser feito seguro assim:

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

Mind da cadeia de citação triplo e o direito pitada antes do fechamento de 3 citações.

  1. Usando uma corda de 3 citado irá garantir que, se o usuário digita '\\"' (espaços adicionados para claridade visual) na cadeia não iria perturbar o avaliador;
  2. O traço no final é um mecanismo de proteção em caso extremidades da corda do usuário com um '\"' Antes de atribuir o resultado que cortar o traço inserido com. [: -1]

Assim, não haveria necessidade de se preocupar com o que os usuários entrar, contanto que é capturado no formato RAW.

Em Python 2,5 a codificação correcta é "unicode_escape", não "Unicode-fuga" (note o sublinhado).

Eu não tenho certeza se a versão mais recente do Python mudou o nome unicode, mas aqui só trabalhou com o sublinhado.

De qualquer forma, é isso.

Em algum momento você vai ter problemas quando se deparar com caracteres especiais como caracteres chineses ou emoticons em uma seqüência que você deseja erros de decodificação ou seja, que se parecem com isto:

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

Para o meu caso (processamento de dados do twitter), eu decodificado como segue para permitir-me para ver todos os personagens sem erros

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

É um pouco perigoso, dependendo de onde a corda está vindo, mas como sobre: ??

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top