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;
}
@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

@szmichaelyb
Copy link

搜狗输入法的一些 emoji 表情,没有包含~

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