在開發中有的時候需要判斷輸入文字中是否含有Emoji表情,先來簡單了解一下Emoji的來源:
Emoji的創造者是日本人栗田穰崇(Shigetaka Kurita),他將目光投向兒時的各種元素以獲取靈感,如日本漫畫和日本漢字等。“日本漫畫中有許多不同的符號。漫畫家會畫出一些表情,表現一個人滿頭大汗或是迸發出一個想法時頭上出現一個燈泡。”同時,從日本漢字中他獲得了一種能力,用簡單的字符來表達“秘密”和“愛”等抽象概念。Emoji尺寸12*12像素,一個圖形兩個字節,目前emoji已被大多數現代計算機系統所兼容的Unicode編碼采納,普遍應用于各種手機短信和社交網絡.
如果想過濾Emoji表情,需要充Emoji表情的編碼如何,先來看常用Emoji表情的編碼:
FlyElephant.png
Emoji表情編碼--FlyElephant
接下來的工作就是Emoji的編碼判斷,如果字符串中字符編碼在Emoji編碼范圍內,那么即可判斷包含Emoji編碼,以下代碼來自網絡,親測有效:
+ (BOOL)validateContainsEmoji:(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];
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 {
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;
}