J'essaie de convertir un emoji en Unicode en python 3. Par exemple, j'aurais l'emoji ???? et j'aimerais obtenir l'unicode correspondant 'U + 1F600'. De même, je voudrais reconvertir le "U + 1F600" en ????. Maintenant, j'ai lu la documentation et essayé plusieurs options, mais le comportement des pythons me confond ici.
>>> x = '????'
>>> y = x.encode('utf-8')
>>> y
b'\xf0\x9f\x98\x80'
L'emoji est converti en objet octet.
>>> z = y.decode('utf-8')
>>> z
'????'
Converti l'objet octet en emoji, jusqu'ici tout va bien.
Maintenant, en prenant l'unicode pour les emoji:
>>> c = '\U0001F600'
>>> d = c.encode('utf-8')
>>> d
>>> b'\xf0\x9f\x98\x80'
Ceci imprime à nouveau le codage d'octets.
>>> d.decode('utf-8')
>>> '????'
Cela imprime à nouveau les emoji. Je ne peux vraiment pas comprendre comment convertir uniquement entre l'Unicode et les emoji.
"????" est déjà un objet Unicode. UTF-8 n'est pas Unicode, c'est un codage d'octets pour Unicode. Pour obtenir le numéro de point de code d'un caractère Unicode, vous pouvez utiliser la fonction ord
. Et pour l'imprimer sous la forme que vous voulez, vous pouvez le formater en hexadécimal. Comme ça:
s = '????'
print('U+{:X}'.format(ord(s)))
sortie
U+1F600
Si vous avez Python 3.6+, vous pouvez le rendre encore plus court (et plus efficace) en utilisant une f-string:
s = '????'
print(f'U+{ord(s):X}')
BTW, si vous souhaitez créer une séquence d'échappement Unicode comme '\U0001F600'
il y a le 'unicode-escape'
codec. Cependant, il retourne une chaîne bytes
, et vous souhaiterez peut-être la reconvertir en texte. Vous pouvez utiliser le codec "UTF-8" pour cela, mais vous pouvez tout aussi bien utiliser le codec "ASCII", car il est garanti de ne contenir que des ASCII valides.
s = '????'
print(s.encode('unicode-escape'))
print(s.encode('unicode-escape').decode('ASCII'))
sortie
b'\\U0001f600'
\U0001f600
Je vous suggère de jeter un coup d'œil à ce court article du co-fondateur de Stack Overflow, Joel Spolsky Le minimum absolu que chaque développeur de logiciels doit absolument connaître positivement Unicode et les jeux de caractères (pas d'excuses!) .