web-dev-qa-db-fra.com

Pourquoi emoji a-t-il deux codes utf-8 différents? Comment convertir les emoji d'utf-8, utilisez NSString sous ios?

Nous avons trouvé un problème, certains emoji ont deux codes utf-8, tels que:

emoji   unicode    utf-8                another utf-8
????      U+1F601    \xf0\x9f\x98\x81     \xed\xa0\xbd\xed\xb8\x81

Mais le langage ios ne peut pas décoder l'autre type d'utf-8, ce qui entraîne une erreur lorsque je décode une chaîne d'utf-8.

 ios code


Dans tous les documents que j'ai trouvés, je ne peux trouver qu'un type de code utf-8 pour un emoji, pas où trouver l'autre.

Les documents que j'ai référencés incluent:

lien de code emoji

lien de code utf-8 complet

Mais dans un outil Web bianma , tous les deux types de code utf-8 peuvent être convertis correctement en emoji.

 input code

 ouput


Donc, ma question est:

  1. Pourquoi existe-t-il deux types de codes utf-8 pour un emoji?

  2. Où se trouve un document contenant les deux types de codes utf-8?

  3. Comment convertir correctement une chaîne d'utf-8, en utilisant NSString en langage ios?

9
pinchwang

0xF0, 0x9F, 0x98, 0x81

Est-ce que le codage UTF-8 correct pour U + 1F601 ????.

0xED, 0xA0, 0xBD, 0xED, 0xB8, 0x81

N’est pas une séquence UTF-8 valide (*). Cela devrait vraiment être rejeté; iOS est correct pour le faire.

Ceci est un bogue de l’outil bianma: la fonction convertUtf8BytesToUnicodeCodePoints est plus indulgente en ce qui concerne l’entrée qu’elle accepte que l’algorithme spécifié, par exemple dans RFC 3629 .

Cela arrive pour renvoyer une chaîne de travail uniquement parce que l'outil est écrit en JavaScript. Après avoir décodé la séquence d'octets ci-dessus en une séquence de points de code de substitution fictive U + D83D, U + DE01, il la convertit ensuite en chaîne JavaScript à l'aide d'un mappage direct code-unité-code-unité donnant \uD83D\xDE01. Comme c'est la bonne façon de coder ???? dans une chaîne UTF-16, cela semble avoir fonctionné.

(*: Est une séquence CESU-8 valide, mais ce codage est simplement «un codage erroné brisé pour la compatibilité avec des outils historiques mal écrits» et doit généralement être évité.)

Vous ne devriez généralement pas rencontrer une séquence comme celle-ci; En règle générale, il ne vaut pas la peine d'être pris en charge sauf si vous avez une source spécifique de ce type de données malformées que vous n'avez pas le pouvoir de réparer.

9
bobince

Cela a fonctionné pour moi en php pour envoyer un message avec emoji à telegram bot: 

$message_text = " \xf0\x9f\x98\x81 ";
0
Polina