-
-
Save cihancimen/4146056 to your computer and use it in GitHub Desktop.
- (BOOL)stringContainsEmoji:(NSString *)string { | |
__block BOOL returnValue = NO; | |
[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock: | |
^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { | |
const unichar hs = [substring characterAtIndex:0]; | |
// surrogate pair | |
if (0xd800 <= hs && hs <= 0xdbff) { | |
if (substring.length > 1) { | |
const unichar ls = [substring characterAtIndex:1]; | |
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000; | |
if (0x1d000 <= uc && uc <= 0x1f77f) { | |
returnValue = YES; | |
} | |
} | |
} else if (substring.length > 1) { | |
const unichar ls = [substring characterAtIndex:1]; | |
if (ls == 0x20e3) { | |
returnValue = YES; | |
} | |
} else { | |
// non surrogate | |
if (0x2100 <= hs && hs <= 0x27ff) { | |
returnValue = YES; | |
} else if (0x2B05 <= hs && hs <= 0x2b07) { | |
returnValue = YES; | |
} else if (0x2934 <= hs && hs <= 0x2935) { | |
returnValue = YES; | |
} else if (0x3297 <= hs && hs <= 0x3299) { | |
returnValue = YES; | |
} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) { | |
returnValue = YES; | |
} | |
} | |
}]; | |
return returnValue; | |
} |
Anyone using this with iOS 8?
is there C++ code can do this?
Shucks. This doesn't work with all emojis.
works, great ,tks
Yes, this doesn't work with all emojis.
Sorry, have you fixed this issue?
In ios7+, when input chinese using Pinyin:QWERTY/10 Key, it bugs. I found this problem as well, you can change into Chinese input way,I make a breakpoint and found the string change was number with gray color around, I just control the input in should change delegate method, so this code return me yes.
I found the solution, just convert the string first
unichar unicodevalue = [text characterAtIndex:0];
NSString *str = [NSString stringWithCharacters:&unicodevalue length:1];
then use this str to judge
The U+d83e u
Not included
there are some new emojis added in iOS 16.Looks like this code need to be update
@swalehapatanwala the reason for the☺️ wrong detection is because the emoji is composed with two codepoints U+263A U+FE0F whilst the code ignores all composite characters which second codepoint is not 0x20e3. Therefore the code must be fixed and improved!