2011-08-18 11 views

risposta

26

È possibile decodificare una stringa che ha un escape Unicode (\U seguito da 8 cifre esadecimali, zeri) utilizzando il "unicode-escape" codifica:

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

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

Su una build stretta è memorizzato come un UTF-16 surrogato pair:

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

Questa coppia di surrogati viene elaborata correttamente come un'unità di codice durante la codifica:

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

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

Per convertire 976918 a 000ee816 fare 'hex (976918) [2:]. Zfill (8)' – EoghanM

4

Affinché questo funzioni, vi sia bisogno di costruire da soli Python, specificando

./configure --enable-unicode=ucs4 

prima della compilazione, oppure è necessario passare a Python 3.

Anche se si fa questo, ci sono problemi apparentemente su Windows, che verranno risolti nella prossima versione di Python (3.3).

5

Ecco una soluzione alternativa che ho sviluppato con il modulo struct.

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

>>> unichar(int('976918')) 
u'\U000ee816' 
Problemi correlati