2011-08-18 11 views

Odpowiedz

26

można zdekodować ciąg, który ma ucieczki Unicode (\U następnie 8 cyfr HEX, zero-wyściełane) przy użyciu kodowania "unicode-escape":

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

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

Na wąskiej budowie jest przechowywany jako UTF-16 surogat para:

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

to zastępczym para jest prawidłowo przetwarzane jako jednostka kodu w trakcie kodowania:

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

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

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

4

Aby to działało, albo trzeba zbudować Python siebie, określając

./configure --enable-unicode=ucs4 

przed kompilacją, albo trzeba przenieść do Pythona 3.

Nawet jeśli to zrobisz, są najwyraźniej problemy na Windowsie, które zostaną naprawione w następnej wersji Pythona (3.3).

5

Oto alternatywne obejście, które opracowałem z modułem struct.

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

>>> unichar(int('976918')) 
u'\U000ee816' 
Powiązane problemy