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

Explorer les encodages emoji

Barbara Streisand
Libérer: 2025-01-23 04:12:13
original
780 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

Ê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>
Copier après la connexion

Résultat de sortie :

<code>Length:  5
128587  0x1f64b ?
127997  0x1f3fd ?
8205    0x200d  ‍
9794    0x2642  ♂
65039   0xfe0f  ️</code>
Copier après la connexion

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>
Copier après la connexion

Résultat de sortie :

<code>??</code>
Copier après la connexion

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>
Copier après la connexion

Résultat de sortie :

<code>♥
♥️</code>
Copier après la connexion

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>
Copier après la connexion

Résultat de sortie :

<code>?‍?</code>
Copier après la connexion
Copier après la connexion

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>
Copier après la connexion

Résultat de sortie :

<code>?‍?</code>
Copier après la connexion
Copier après la connexion

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>
Copier après la connexion

Résultat de sortie :

<code>0b11111011001001011</code>
Copier après la connexion

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>
Copier après la connexion

Résultat de sortie :

<code>['0xf0', '0x9f', '0x99', '0x8b']</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal