2016-07-01 29 views
14

Bu, Converting to Emoji numaralı izindir. Bu soruda, OP bir \ud83d\ude4f - bir temsilci çifti olarak temsil edilen bir emoji ile json.dumps() kodlu bir dosya vardı. Dosyayı okurken ve emojiyi doğru bir şekilde tercüme ederken problem yaşıyordu ve doğru answer, dosyadan her satır json.loads() oldu ve json modülü, yeniden çiftleştiriciden (UTF8 kodlu olduğunu varsayarak) dönüşümü ele alacaktı. emojisi. Yani buradaPython'da vekil çiftlerle nasıl çalışılır?

benim durumdur: bunun dışında emoji bir temsilini elde etmek

emoji = "This is \ud83d\ude4f, an emoji." 

Nasıl bu dize işlemek yapın: İçinde bir vekil çifti ile sıradan bir Python 3 Unicode dizesi olduğunu varsayalım ? Böyle bir şey almak için arıyorum: denedim

"This is , an emoji." 
# or 
"This is \U0001f64f, an emoji." 

:

print(emoji) 
print(emoji.encode("utf-8")) # also tried "ascii", "utf-16", and "utf-16-le" 
json.loads(emoji) # and `.encode()` with various codecs 

Genellikle ben UnicodeEncodeError: XXX codec can't encode character '\ud83d' in position 8: surrogates no allowed benzer bir hata alıyorum.

$LANGen_US.UTF-8'a ayarlı Linux üzerinde Python 3.5.1 çalıştırıyorum. Bu örnekleri hem Python yorumlayıcısında komut satırında, hem de Subtime Metninde çalışan IPython içinde çalıştırıyorum - herhangi bir farklılık görünmüyor. ve bellekte (Python kaynak kodunda değişmez bir dize kullanarak belirtilen) bir tek karakteri u'\ud83d':

cevap

21

Sen diskteki bir json dosyası (\ u d 8 3 d altı karakter) değişmez bir dize \ud83d karışık ettik. Sonra bir hata memba var '\ud83d\ude4f' Python dize (karakter) görürseniz Python 3.

üzerinde len(r'\ud83d') == 6 ve len('\ud83d') == 1 arasındaki farktır. Normalde böyle bir ipi almamalısın. Eğer bir tane alırsanız ve onu üreten akıntıyı düzeltemezseniz; Eğer surrogatepass hata işleyicisi kullanarak saptamak o:

>>> "\ud83d\ude4f".encode('utf-16', 'surrogatepass').decode('utf-16') 
'' 

Python 2 was more permissive.

Not: json dosyanızda literal \ ud83d \ ude4f (karakterleri) varsa bile; Eğer yedek çifti almak olmamalı:

>>> print(ascii(json.loads(r'"\ud83d\ude4f"'))) 
'\U0001f64f' 

Bildirimi: Sonuç karakteri ('\U0001f64f') değil, yedek çifti ('\ud83d\ude4f') 'dir.

+0

Harika, teşekkürler! Ben "surrogatepass" hata işleyicisi eksikti. – MattDMo