Skip to content

Instantly share code, notes, and snippets.

@cihancimen
Created November 26, 2012 00:54
Show Gist options
  • Save cihancimen/4146056 to your computer and use it in GitHub Desktop.
Save cihancimen/4146056 to your computer and use it in GitHub Desktop.
Check if an NSString contains an emoji character
- (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;
}
@kas-kad
Copy link

kas-kad commented Aug 11, 2014

@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!

@msambol
Copy link

msambol commented Nov 18, 2014

Anyone using this with iOS 8?

@guoxj
Copy link

guoxj commented Jan 7, 2015

is there C++ code can do this?

@brentkirkland
Copy link

Shucks. This doesn't work with all emojis.

@peanutgao
Copy link

works, great ,tks

@dabing1022
Copy link

Yes, this doesn't work with all emojis.

@tranhieutt
Copy link

Sorry, have you fixed this issue?

@mi-Fei
Copy link

mi-Fei commented Dec 1, 2016

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.

@mi-Fei
Copy link

mi-Fei commented Dec 1, 2016

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

@TimorYang
Copy link

The U+d83e u Not included

@steve7688
Copy link

there are some new emojis added in iOS 16.Looks like this code need to be update

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment