¿Cómo trato una cadena ASCII como unicode y no escapo los caracteres escapados en python?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Por ejemplo, si tengo una cadena unicode , puedo codificarla como una cadena ASCII así:

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

Sin embargo, tengo p. esta cadena ASCII :

'\u003foo\u003e'

... que quiero convertir en la misma cadena ASCII que en mi primer ejemplo anterior:

'<foo/>'
¿Fue útil?

Solución

Me tomó un tiempo resolver esto, pero esta página tuvo la mejor respuesta:

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

También hay un códec 'raw-unicode-escape' para manejar la otra forma de especificar cadenas Unicode: verifique " Constructores Unicode " sección de la página vinculada para más detalles (ya que no soy tan Unicode-saavy).

EDITAR: Consulte también Codificaciones estándar de Python .

Otros consejos

Ned Batchelder dijo:

  

Es un poco peligroso dependiendo de dónde viene la cuerda,   pero que tal:

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

En realidad, este método puede ser seguro de esta manera:

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

Tenga en cuenta la cadena de comillas triples y el guión justo antes de las 3 comillas de cierre.

  1. El uso de una cadena de 3 comillas asegurará que si el usuario ingresa '\\ " '(espacios añadidos para claridad visual) en la cadena no interrumpiría al evaluador;
  2. El guión al final es a prueba de fallas en caso de que la cadena del usuario termine con un '\ " '. Antes de asignar el resultado, dividimos el guión insertado con [: -1]

Por lo tanto, no habría necesidad de preocuparse por lo que ingresan los usuarios, siempre que se capture en formato sin formato.

En Python 2.5 la codificación correcta es "unicode_escape", no "unicode-escape" (tenga en cuenta el guión bajo).

No estoy seguro de si la versión más reciente de Python cambió el nombre Unicode, pero aquí solo funcionó con el guión bajo.

De todos modos, esto es todo.

En algún momento se encontrará con problemas cuando encuentre caracteres especiales como caracteres chinos o emoticones en una cadena que desee decodificar, es decir, errores que se vean así:

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

Para mi caso (procesamiento de datos de Twitter), decodifiqué lo siguiente para permitirme ver todos los caracteres sin errores

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

Es un poco peligroso dependiendo de dónde viene la cadena, pero ¿qué tal:

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top