2008-11-06 21 views

Respuesta

43

Me tomó un tiempo darme cuenta de esto, pero this page tuvieron 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 'prima-Unicode-escape' para manejar la otra forma de especificar cadenas Unicode - consulte la sección de "Unicode constructores" de la página de enlace para más detalles (ya que no soy ese Unicode-saavy).

EDITAR: Vea también Python Standard Encodings.

+0

Esto hace exactamente lo que quiero. ¡Gracias un montón! – John

+0

http://www.python.org/doc/2.5.2/lib/standard-encodings.html –

-1

Es un poco peligroso dependiendo de donde la La secuencia viene de, pero ¿qué tal:

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

Desafortunadamente, nuestra entrada proviene de los usuarios, por lo que sería demasiado peligroso para nosotros. – John

1

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

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

De todos modos, esto es todo.

2

Ned Batchelder dijo:

Es un poco peligroso dependiendo de donde la cadena está viniendo, pero ¿qué tal:

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

En realidad este método se pueden hacer segura como ese:

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

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

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

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

0

En algún momento que se ejecutará en problemas cuando se encuentra con caracteres especiales como caracteres chinos o emoticones en una cadena que desea decodificar es decir, los errores que se ven 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é de la siguiente manera para permitirme ver todos los caracteres sin errores

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