Maison >développement back-end >Tutoriel Python >Explorer les encodages emoji

Explorer les encodages emoji

Barbara Streisand
Barbara Streisandoriginal
2025-01-23 04:12:13786parcourir

Plongée en profondeur dans l'encodage Emoji : de l'Unicode à l'UTF-8 octets

Avez-vous essayé de convertir une chaîne contenant des Emoji en octets ?

<code class="language-python">text = 'Hi ??‍♂️'

print(bytes(text, 'utf-8'))</code>

Résultat de sortie :

<code>b'Hi \xf0\x9f\x99\x8b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f'</code>

Êtes-vous curieux de savoir ce que sont ces x et comment ils se reconvertissent en Emoji ?

En creusant plus profondément, vous constaterez qu'un seul Emoji nécessite cinq caractères Unicode pour être représenté.

<code class="language-python">emoji = '??‍♂️'
print("Length: ", len(emoji))
for c in emoji:
    code = ord(c)
    print("{}\t{}\t{}".format(code, hex(code), c))</code>

Résultat de sortie :

<code>Length:  5
128587  0x1f64b ?
127997  0x1f3fd ?
8205    0x200d  ‍
9794    0x2642  ♂
65039   0xfe0f  ️</code>

Tout d'abord, nous avons l'emoji de base : Personne avec les mains levées ? (128587 ou 0x1f64b en hexadécimal), généralement représenté par U 1F64B.

Ensuite, il y a le modificateur de teint : Light Skin Tone (127997).

Combinez ces deux-là et vous obtenez une personne à main levée neutre avec ce teint.

<code class="language-python">print(chr(128587) + chr(127997))</code>

Résultat de sortie :

<code>??</code>

L'avant-dernier caractère représente le symbole masculin, et le dernier caractère s'appelle Variant Selector-16 (VS16), ce qui indique que le caractère précédent doit être affiché sous forme d'emoji et non de symbole.

De nombreux caractères peuvent être affichés sous forme de symboles ou d'émojis.

<code class="language-python">heart_symbol= '♥'
print(heart_symbol)
print(heart_symbol + chr(65039))</code>

Résultat de sortie :

<code>♥
♥️</code>

Remarque : si le système ou le moteur de rendu ne prend pas en charge l'emoji, il peut être rendu sous forme de symbole. Dans ce cas, copiez le résultat et collez-le dans un autre éditeur de texte ou navigateur pour voir les différences.

Par conséquent, les deux premiers et les deux derniers caractères représentent deux expressions Emoji distinctes. Le caractère du milieu est appelé un menuisier de largeur nulle (ZWJ) et est utilisé pour combiner deux ou plusieurs emoji.

<code class="language-python">woman = '?'
laptop = '?'
print(woman + chr(8205) + laptop)</code>

Résultat de sortie :

<code>?‍?</code>

Bien sûr, le système ou la police doit prendre en charge ces combinaisons, sinon ils seront simplement rendus sous forme de caractères séparés.

<code class="language-python">man = '?'
toilet = '?'

print(man + chr(8205) + toilet)</code>

Résultat de sortie :

<code>?‍?</code>

Voyons maintenant comment chaque caractère Unicode est représenté sous forme d'octets dans l'encodage UTF-8 en général.

Considérons le caractère U 1F64B.

Tout d'abord, nous devons déterminer combien d'octets sont nécessaires pour le stocker en fonction de la plage du caractère. Nous pourrions stocker le nombre lui-même sur seulement trois octets, mais il n’y aurait alors aucun moyen de le décoder en un seul caractère. Par conséquent, le modèle suivant est utilisé : (Pourquoi utiliser ce modèle ?)

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Maintenant, mettons les bits du nombre 0x1f64b dans ce modèle. Convertissez-le d’abord en binaire.

<code class="language-python">print(bin(0x1F64B))</code>

Résultat de sortie :

<code>0b11111011001001011</code>

Le motif a 21 bits, ajoutons donc 0 au début pour correspondre :

000011111011001001011
000 011111 011001 001011

Mise en patron : 11110000 10011111 10011001 10001011

Maintenant, quelle est la représentation hexadécimale de ces octets ?

<code class="language-python">print(list(map(hex, [0b11110000, 0b10011111, 0b10011001, 0b10001011])))</code>

Résultat de sortie :

<code>['0xf0', '0x9f', '0x99', '0x8b']</code>

Notez que ceux-ci correspondent aux quatre premiers x que nous voulons comprendre. Maintenant vous savez ce qu'ils veulent dire.

Notes associées : https://www.php.cn/link/0da44af358e8fcb6a6c2040602172d8d

Exploring emoji encodings

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn