Skip to content

Instantly share code, notes, and snippets.

@cihancimen
Created November 26, 2012 00:54
Show Gist options
  • Star 69 You must be signed in to star a gist
  • Fork 16 You must be signed in to fork a gist
  • 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;
}
@ilterish7
Copy link

Very, very grateful

@young40
Copy link

young40 commented Jul 25, 2013

it works. great.

btw, is there C++ code can do this? thanks.

@young40
Copy link

young40 commented Jul 25, 2013

it works. great.

btw, is there C++ code can do this? thanks.

@DanielYWoo
Copy link

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.

@bluefish625
Copy link

In ios7, when input chinese using Pinyin:QWERTY/10 Key, it bugs.

@aSoonhoHong
Copy link

Can I use this code snippet?

@truebit
Copy link

truebit commented Mar 21, 2014

@bluefish625 Could you describe what bug exactly concerning Pinyin:QWERTY/10 Key? I cannot find any problem.

@HenryHins
Copy link

@cihancimen , can you please please please please make this in Swift? I really need this! Thanks a lot!

@swalehapatanwala
Copy link

This code doesn't work for all emojis. I have tested it for few emojis. It doesn't work for ☺️ emoji. Can you tell me what could be the reason ?

@kas-kad
Copy link

kas-kad commented Aug 11, 2014

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?

@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