-
-
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; | |
} |
it works. great.
btw, is there C++ code can do this? thanks.
it works. great.
btw, is there C++ code can do this? thanks.
Great! We are gonna use this code snippet to remove all emoji characters, those characters shows up ugly on android devices, as a cross platform mobile application we implemented our own emoji solution which looks exactly the same on iOS/Android/Web.
In ios7, when input chinese using Pinyin:QWERTY/10 Key, it bugs.
Can I use this code snippet?
@bluefish625 Could you describe what bug exactly concerning Pinyin:QWERTY/10 Key? I cannot find any problem.
@cihancimen , can you please please please please make this in Swift? I really need this! Thanks a lot!
This code doesn't work for all emojis. I have tested it for few emojis. It doesn't work for
Surrogate Pairs : the Unicode standard has reserved the range from U+D800 to U+DFFF for the use of UTF-16
(wiki)
but in this code the range is
if (0xd800 <= hs && hs <= 0xdbff) {
did I missed something?
@swalehapatanwala the reason for the
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
Very, very grateful