2011-08-18 15 views

Respuesta

26

Puede decodificar una cadena que tiene un escape de Unicode (\U seguido de 8 dígitos hexadecimales, con relleno de ceros) utilizando el "unicode-escape" codificación:

>>> s = "\\U%08x" % 976918 
>>> s 
'\\U000ee816' 

>>> c = s.decode('unicode-escape') 
>>> c 
u'\U000ee816' 

En una estructura del estrecho se almacena como un sustituto UTF-16 par:

>>> list(c) 
[u'\udb7a', u'\udc16'] 

Este par suplente se procesa correctamente como una unidad de código durante la codificación:

>>> c.encode('utf-8') 
'\xf3\xae\xa0\x96' 

>>> '\xf3\xae\xa0\x96'.decode('utf-8') 
u'\U000ee816' 
+0

Convertir 976918 a 000ee816 do 'hex (976918) [2:]. Zfill (8)' – EoghanM

4

Para que esto funcione, que sea necesario para construir Python mismo, especificando

./configure --enable-unicode=ucs4 

antes de compilar, o de lo contrario tiene que mover a Python 3.

Incluso si lo hace, aparentemente hay problemas en Windows, que se corregirán en la próxima versión de Python (3.3).

5

Aquí hay una solución alternativa que desarrollé con el módulo struct.

def unichar(i): 
    try: 
     return unichr(i) 
    except ValueError: 
     return struct.pack('i', i).decode('utf-32') 

>>> unichar(int('976918')) 
u'\U000ee816' 
Cuestiones relacionadas