2016-10-19 2 views
0

Ich versuche herauszufinden, ob ein Benutzer meiner App ein Emoji in UITextView eingegeben hat. Ich habe diesen Code gefunden:Wie erkennt man Emoji iOS

https://gist.github.com/cihancimen/4146056

dieser Code ist jedoch nicht für alle Emojis arbeiten (zum Beispiel ist nicht für den Herd Symbol arbeiten). Hat jemand eine Idee, wie man den Code verbessert, um alle Emojis zu fangen? Ich benutze Objective-C-Sprache. Jede Hilfe wird geschätzt.

+0

Mögliche doppelte http://stackoverflow.com/questions/30757193/find-out-if-character-in-string-is-emoji – sbarow

Antwort

0

Dies ist, wie ich es in meiner app tun:

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 
    if textView.textInputMode?.primaryLanguage == "emoji" || textView.textInputMode?.primaryLanguage == nil { 
     // An emoji was typed by the user 
     // Do anything you need to do (or return false to disallow emojis) 
    } 

    return true 
} 
+0

Vielen Dank. Ich habe es auch so überprüft, während ich einen Text eingegeben habe. Aber ich habe die Logik der Anwendung geändert, und jetzt muss ich es erkennen, wenn der Benutzer versucht, den Text zu senden, nachdem er die Taste gedrückt hat, um den Text an den Server zu senden. Die Überprüfung sollte also nicht im laufenden Betrieb erfolgen, während der Benutzer tippt, sondern nach dem Drücken der Taste. Wissen Sie, wie Sie Ihren Code ändern können, um dies zu erreichen? Vielen Dank. – Jeavy

1

Wenn Sie Emojis erfassen müssen in der Lage, finden Sie eine Liste erstellen müssen, um alle Codepunkte für Emoji verwendet, die (oder eine Liste aller Emoji, wenn Sie bevorzugen). Wenn Sie möchten, können Sie sehen, wie Emoji in this framework, die ich zum Zweck des Ersetzens von Standard-Emoji mit benutzerdefinierten Bildern erstellt wurde, entdeckt werden, oder werfen Sie einen Blick auf my answer to a related question.

Dann, wenn Sie arbeiten mit Objective-C und den NSString Typ, müssen Sie zuerst die Zeichenfolge der unichar s umwandeln müssen (die UTF-16 sind codierte) in UTF-32-kompatibles Format zu verwenden, um Ihre Liste der Codepunkte. Wenn Sie den UTF-32-Wert haben, zu vergleichen, nur um es gegen Ihre Liste und behandelt sie jedoch benötigen Sie:

// Sample text. 
NSString *text = @"a "; 

// Get the UTF-16 representation of the text. 
unsigned long length = text.length; 
unichar buffer[length]; 
[text getCharacters:buffer]; 

// Initialize array to hold our UTF-32 values. 
NSMutableArray *array = [[NSMutableArray alloc] init]; 

// Temporary stores for the UTF-32 and UTF-16 values. 
UTF32Char utf32 = 0; 
UTF16Char h16 = 0, l16 = 0; 

for (int i = 0; i < length; i++) { 
    unichar surrogate = buffer[i]; 

    // High surrogate. 
    if (0xd800 <= surrogate && surrogate <= 0xd83f) { 
     h16 = surrogate; 
     continue; 
    } 
    // Low surrogate. 
    else if (0xdc00 <= surrogate && surrogate <= 0xdfff) { 
     l16 = surrogate; 

     // Convert surrogate pair to UTF-32 encoding. 
     utf32 = ((h16 - 0xd800) << 10) + (l16 - 0xdc00) + 0x10000; 
    } 
    // Normal UTF-16. 
    else { 
     utf32 = surrogate; 
    } 

    // Compare the UTF-32 value against your list of code points, and handle. 
    // Just demonstrating with the code point for . 
    if (utf32 == 0x1f601) { 
     NSLog(@"It's an emoji!"); 
    } 

} 

Zusätzlich werden Sie Variation Selectors behandeln müssen, wenn Sie nicht Fehlalarme wollen, und zero-width joiners wenn Sie müssen in der Lage sein, mit Sequenzen umzugehen, aber wenn Sie nur auf das erste Zeichen in einer Sequenz schauen, wird es Ihnen sagen, ob die Zeichenkette ein Emoji enthält, also werde ich nicht weiter darauf eingehen.