Pourquoi ne emoji ont deux différents utf-8 codes? Comment faire pour convertir les émoticônes de l'utf-8 , l'utilisation NSString dans ios?
Nous avons trouvé un problème, que certains emoji ont deux utf-8 codes, tels que:
emoji unicode utf-8 another utf-8
😁 U+1F601 \xf0\x9f\x98\x81 \xed\xa0\xbd\xed\xb8\x81
Mais ios langue ne peut pas décoder l'autre type de l'utf-8, donc résultant d'une erreur lorsque j'essaie de décoder la chaîne de caractères utf-8.
Dans tous les documents que j'ai trouvé, je peux juste trouver un type d'utf-8 code pour un emoji, pas de où trouver les autres.
Documents que j'ai référencé comprend:
Mais dans un outil web bianma, toutes les deux types de utf-8 code peut être converti en emoji correctement.
Donc, ma question est :
- Pourquoi il y a deux types de utf-8 codes d'un emoji ?
- Où est un document qui comporte les deux types de utf-8 codes?
- Comment convertir correctement chaîne en utf-8, à l'aide de NSString dans ios langue?
Ce qui m'a intrigué que ma première pensée a été que le long de l'UTF-8 de la représentation a deux UTF-8 pâtés de maisons. Il s'avère qu'il existe deux variantes de l'UTF-8, CESU-8 et Modifié UTF-8, qui encode en UTF-16 style. Vous pouvez être en mesure d'utiliser cet article iphonedevsdk.com/forum/iphone-sdk-development/... pour écrire un décodeur si il n'y a pas de système approprié pour iOS/Objective-C décodeur natif.
C'est la réponse je pense. Vous devriez poster que comme une réponse.
Veuillez ne jamais poster du texte que des images, surtout pas de code ou de sortie.
Merci @roeland. Je pense que la bonne réponse devrait contenir du code de travail, mais comme je ne suis pas Objective-C codeur, je vais le laisser à quelqu'un d'autre pour le ramassage de la gloire 🙂
C'est la réponse je pense. Vous devriez poster que comme une réponse.
Veuillez ne jamais poster du texte que des images, surtout pas de code ou de sortie.
Merci @roeland. Je pense que la bonne réponse devrait contenir du code de travail, mais comme je ne suis pas Objective-C codeur, je vais le laisser à quelqu'un d'autre pour le ramassage de la gloire 🙂
OriginalL'auteur pinchwang | 2015-12-22
Vous devez vous connecter pour publier un commentaire.
Est le bon encodage UTF-8 pour U+1F601 .
N'est pas UTF-8 valide séquence(*). Il faut vraiment être rejeté; iOS est correct de le faire.
C'est un bug dans le bianma outil: le
convertUtf8BytesToUnicodeCodePoints
fonction est plus indulgent sur entrée qu'il accepte que l'algorithme spécifié dans eg RFC 3629.Ce qui se passe pour renvoyer une chaîne de travail seulement parce que l'outil est écrit en JavaScript. Avoir décodé au-dessus de la séquence d'octets pour le bidon de substitution point de code séquence U+D83D,U+DE01 il les convertit ensuite en JavaScript chaîne à l'aide directe de code-point-de-code-l'unité de cartographie de donner
\uD83D\xDE01
. Comme ce est la bonne façon de coder en UTF-16 chaîne, il semble avoir fonctionné.(*: Il est valide CESU-8 de la séquence, mais que l'encodage est juste de “faux cassé codant pour la compatibilité avec les mal-écrits historiques outils” et doit généralement être évitée.)
Vous ne devriez pas habituellement à la rencontre d'une séquence comme ça, c'est généralement pas la peine de restauration pour sauf si vous avez une source de ce genre de données malformées qui vous n'avez pas le pouvoir d'obtenir fixe.
Je voudrais tout d'abord regarder le serveur C++ UTF-8 encodeur, pour voir si il peut être fixé correctement à la source. CESU-8 est considéré comme un indésirable anomalie que vous n'auriez jamais délibérément souhaitez utiliser; la plupart des systèmes ne prennent pas en charge. Si vous pour accepter, vous aurez besoin d'écrire votre propre CESU-8 décodeur marche à travers le tableau d'octets d'entrée (ou d'utiliser une bibliothèque existante, par exemple, ICU bien que ce serait une très lourde dépendance juste pour cela).
Tout comme une note de côté, il en est un particulièrement gênants source de codage comme ceci: JNI (Java Native Interface). Si vous essayez de récupérer des "UTF-8" octets à partir d'un Java chaîne, vous recevrez le "modifié UTF-8" variante. C'est plutôt une source importante de données malformées qui ne peut être fixé, malheureusement.
OriginalL'auteur bobince
Cela a fonctionné pour moi en php pour envoyer un message avec des emoji de télégramme bot:
OriginalL'auteur Polina