在開發(fā)中有的時(shí)候需要判斷輸入文字中是否含有Emoji表情谤牡,先來(lái)簡(jiǎn)單了解一下Emoji的來(lái)源:
Emoji的創(chuàng)造者是日本人栗田穰崇(Shigetaka Kurita),他將目光投向兒時(shí)的各種元素以獲取靈感竞慢,如日本漫畫和日本漢字等。“日本漫畫中有許多不同的符號(hào)戒突。漫畫家會(huì)畫出一些表情氯迂,表現(xiàn)一個(gè)人滿頭大汗或是迸發(fā)出一個(gè)想法時(shí)頭上出現(xiàn)一個(gè)燈泡践叠。”同時(shí)嚼蚀,從日本漢字中他獲得了一種能力禁灼,用簡(jiǎn)單的字符來(lái)表達(dá)“秘密”和“愛”等抽象概念。Emoji尺寸12*12像素轿曙,一個(gè)圖形兩個(gè)字節(jié)弄捕,目前emoji已被大多數(shù)現(xiàn)代計(jì)算機(jī)系統(tǒng)所兼容的Unicode編碼采納,普遍應(yīng)用于各種手機(jī)短信和社交網(wǎng)絡(luò).
如果想過(guò)濾Emoji表情,需要充Emoji表情的編碼如何导帝,先來(lái)看常用Emoji表情的編碼:
FlyElephant.png
Emoji表情編碼--FlyElephant
接下來(lái)的工作就是Emoji的編碼判斷守谓,如果字符串中字符編碼在Emoji編碼范圍內(nèi),那么即可判斷包含Emoji編碼舟扎,以下代碼來(lái)自網(wǎng)絡(luò)分飞,親測(cè)有效:
+ (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;
}