2016-10-19 12 views
0

私のアプリのユーザーがUITextViewに絵文字を入力したかどうかを検出しようとしています。私はこのコードを発見した:絵文字の検出方法

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

しかし、このコードは、すべての絵文字(例えば、それはハースシンボルのために働いていない)のために働いていません。誰かが、すべての絵文字を捕らえるためにコードを改善する方法を手がかりにしていますか?私はObjective-C言語を使用しています。どんな助けもありがとうございます。

+0

可能な複製http://stackoverflow.com/questions/30757193/find-out-if-character-in-string-is-emoji – sbarow

答えて

0

これは、私は私のアプリでそれを行う方法です。

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

ありがとうございました。テキストを入力する際に​​もこの方法でチェックしていました。しかし、私はアプリケーションのロジックを変更し、ユーザーがテキストをサーバーに送信するためにボタンを押した後にテキストを送信しようとすると、それを検出する必要があります。したがって、ユーザーが入力している間に、ボタンを押した後で、その場でチェックが行われるべきではありません。これを達成するためにコードを変更する方法を知っていますか?ありがとうございました。 – Jeavy

1

あなたはどんな絵文字を検出できるようにする必要がある場合は、絵文字のために使用されるすべてのコードポイントを含むリストを作成する必要があります(またはあなたが好きなら、すべての絵文字のリスト)。標準絵文字をカスタムイメージに置き換える目的で作成したthis frameworkで絵文字がどのように検出されたかを見てみるか、my answer to a related questionを見てください。

Objective-CとNSStringタイプで作業している場合は、文字列のunichar(UTF-16でエンコードされている)をUTF-32互換のフォーマットに変換してから使用する必要がありますコードポイントのリストあなたは偽陽性をしたくない場合は

// 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!"); 
    } 

} 

また、あなたがVariation Selectorsを処理する必要があります、とzero-width joiners場合:あなたはUTF-32値を持っている場合は、ちょうどあなたのリストに対してそれを比較し、それを扱うしかし、あなたが必要ですシーケンスを扱えるようにする必要がありますが、シーケンス内の最初の文字を見るだけで、文字列に絵文字が含まれているかどうかがわかりますので、これ以上は触れません。