Détecter si un utilisateur a tapé un caractère emoji dans UITextView
J'ai un UITextView et j'ai besoin de détecter si un utilisateur entre un emoji caractère.
Je pense que la simple vérification de la valeur unicode du nouveau personnage devrait suffire, mais avec la nouvelle emoji 2s, certains caractères sont dispersés tout au long de l'unicode index (c'est à dire Apple nouvellement conçu droit d'auteur et d'enregistrer les logos).
Peut-être quelque chose à voir avec la vérification de la langue du personnage avec NSLocale ou LocalizedString valeurs?
Personne ne sait ce une bonne solution?
Merci!
source d'informationauteur Albert Renshaw
Vous devez vous connecter pour publier un commentaire.
Fil des ans, ces emoji de détection de solutions de garder la rupture qu'Apple ajoute de nouvelles émoticônes w/nouvelles méthodes (comme une peau tonique émoticônes construit par pré-maudire un personnage avec un caractère additionnel), etc.
J'ai finalement craqué et vient d'écrire la méthode suivante qui fonctionne pour tous les émoticônes et devrait fonctionner pour tous les futurs émoticônes.
La solution crée un UILabel avec du caractère et un arrière-plan noir. CG puis prend une photo de l'étiquette et je scanne tous les pixels dans l'instantané pour tout non solide-pixels noirs. La raison pour laquelle je ajouter le fond noir est pour éviter les problèmes de faux-coloriage en raison de Sous-Pixel Rendering
La solution passe TRÈS vite sur mon appareil, je peux vérifier des centaines de personnages d'une seconde, mais il convient de noter que c'est un CoreGraphics solution et ne doit pas être très utilisé comme une méthode de texte. Le traitement graphique des données est lourd donc la vérification des milliers de personnages à la fois pourrait entraîner notable de retard.
Une autre solution: https://github.com/woxtu/NSString-RemoveEmoji
Puis, après l'importation de cette extension, vous pouvez l'utiliser comme ceci:
Espère que ça aide 😉
D'abord laisser l'adresse de votre "55357 méthode" – et pourquoi il travaille pour de nombreux caractères emoji.
Dans le Cacao, un
NSString
est une collection deunichar
s, etunichar
est juste un typealias pourunsigned short
qui est le même queUInt16
. Puisque la valeur maximale deUInt16
est0xffff
tout à fait un peu de emoji d'être capables de s'intégrer dans ununichar
que seulement deux des six principaux blocs Unicode utilisé pour emoji relèvent de cette gamme:Ces blocs contiennent des 113 emoji, et un supplément de 66 emoji peut être représenté comme un seul
unichar
peuvent être trouvés répartis dans différents autres blocs. Cependant, ces 179 caractères ne représentent qu'une fraction de la 1126 emoji de la base de caractèresle reste de ce qui doit être représenté par plus d'ununichar
.Nous allons analyser votre code:
Ce qui se passe, c'est que vous êtes tout simplement en prenant le premier
unichar
de la chaîne, et bien que cela fonctionne pour le mentionné précédemment 179 caractères, en dehors des pauses lorsque vous rencontrez un UTF-32 caractères, depuisNSString
convertit tout en UTF-16. La conversion fonctionne par la substitution de l'UTF-32 valeur avec les paires de substitutionce qui signifie que leNSString
contient maintenant deuxunichar
s.Et maintenant nous sommes arriver à pourquoi le nombre 55357, ou
0xd83d
apparaît pour de nombreux emoji: lorsque vous regardez seulement le premier UTF-16 valeur de l'UTF-32 caractères, vous bénéficiez du haut niveau de substitution, qui ont chacune une durée de 1024 faible des mères porteuses. La gamme pour le haut de substitution0xd83d
est U+1F400–U+1F7FF, qui commence au milieu de la plus grande emoji bloc, Divers Symboles et Pictogrammes (U+1F300–U+1F5FF), et continue tout le chemin jusqu'à Formes Géométriques Étendu (U+1F780–U+1F7FF) contenant un total de 563 emoji, et 333 non-emoji caractères à l'intérieur de cette plage.Donc, impressionnant de 50% des emoji de la base de caractères ont la haute substitution
0xd83d
mais ces méthodes de déduction toujours laisser 384 caractères emoji non gérée, ainsi que de donner de faux positifs pour au moins autant de.Alors, comment pouvez-vous détecter si un caractère est un emoji ou pas?
J'ai récemment répondu à une en quelque sorte liée à la question avec une mise en œuvre rapideet si vous le souhaitez, vous pouvez regarder comment les emoji sont détectés dans ce cadreque j'ai créé pour le but de remplacer la emoji avec des images personnalisées.
De toute façon, ce que vous pouvez faire est d'extraire le code UTF-32 le point sur les personnages, que nous allons faire selon la spécification:
Tapant "" dans le
UITextView
écrit ceci dans la console:Avec cette logique, il suffit de comparer la valeur de
character
à votre source de données de emoji points de code, et vous saurez exactement si le personnage est un emoji ou pas.P. S.
Il y a quelques "invisible" personnages, à savoir Variation Des Sélecteurs et zéro-largeur menuisiersqui devraient également être traitées, donc je vous recommande l'étude de ces à savoir comment ils se comportent.
si vous ne souhaitez pas que votre clavier pour afficher les émoticônes que vous pouvez utiliser
YOURTEXTFIELD/YOURTEXTVIEW.keyboardType = .ASCIICapable
Cela fera apparaître un clavier sans emoji
Eh bien, vous pouvez détecter si il n'a que des caractères ascii en utilisant ceci:
Il n'en dira pas si elle échoue (ou émoticônes). Ensuite, vous pouvez faire une instruction if else qui ne leur permet pas de cliquez sur entrer ou de quelque chose.
Emoji caractères d'une longueur de 2 et ainsi de vérifier si la chaîne est de longueur 2 de la méthode qui est shouldChangeTextInRange: qui est appelée après chaque touche du clavier frappé