web-dev-qa-db-fra.com

Conversion d'emojis en Unicode et vice versa dans python 3

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.

10
imc

"????" 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!) .

14
PM 2Ring