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.
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:
Mais dans un outil Web bianma , tous les deux types de code utf-8 peuvent être convertis correctement en emoji.
Donc, ma question est:
Pourquoi existe-t-il deux types de codes utf-8 pour un emoji?
Où se trouve un document contenant les deux types de codes utf-8?
Comment convertir correctement une chaîne d'utf-8, en utilisant NSString en langage ios?
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.
Cela a fonctionné pour moi en php pour envoyer un message avec emoji à telegram bot:
$message_text = " \xf0\x9f\x98\x81 ";