UITextView/UITextField檢測并過濾Emoji表情符號

UITextView/UITextField檢測并過濾Emoji表情符號

本人在開發(fā)過程中遇到過這種情況两蟀,服務(wù)器端不支持Emoji表情上渴,因此要求客戶端在上傳用戶輸入時(shí),不能包含Emoji表情齐佳。在客戶端發(fā)送請求前船惨,判斷用戶輸入中是否含有表情,如果含有表情擂错,則提示用戶重新輸入。這個(gè)過程關(guān)鍵是如何判斷字符串中是否含有Emoji表情樱蛤。

經(jīng)過多番查找資料和測試Demo钮呀,目前有以下兩種方式比較合理:

  1. 當(dāng)用戶切換鍵盤為Emoji表情時(shí),輸入的表情不響應(yīng)(即表情符號不顯示到UITextView或UITextField)昨凡。這里可以通過UITextView或UITextField的回調(diào)和是否為emoji鍵盤:

     /*
     *第一種方法爽醋,簡單粗暴
     */
     - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
     {
         // 不讓輸入表情
         if ([textView isFirstResponder]) {
             if ([[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textView textInputMode] primaryLanguage]) {
                 NSLog(@"輸入的是表情,返回NO");
                 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告便脊!" message:@"不能輸入表情" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定",nil];
                 [alertView show];
                 return NO;
             }
         }
         return YES;
     }
    
  2. 為避免當(dāng)用戶通過中文鍵盤輸入中文“哈哈”后出現(xiàn)可選文字中選中的Emoji笑臉蚂四,最后在- (void)textFieldDidEndEditing:(UITextField *)textField方法中統(tǒng)一通過檢查最終字符串textField/textView.text的內(nèi)容,通過Emoji篩unicode編碼來判斷是否存在Emoji表情哪痰,如果存在則提醒用戶做修改遂赠。

     //在輸入完成時(shí),調(diào)用下面那個(gè)方法來判斷輸入的字符串是否含有表情
     - (void)textFieldDidEndEditing:(UITextField *)textField
     {
         if ([self stringContainsEmoji:textField.text]) {
             NSLog(@"含有表情");
             UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告晌杰!" message:@"輸入內(nèi)容含有表情跷睦,請重新輸入" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定",nil];
             [alertView show];
             textField.text = @"";
             [textField becomeFirstResponder];
         }else {
             NSLog(@"不含有表情");
         }
         
     }
     
     /*
      *第二種方法,利用Emoji表情最終會被編碼成Unicode肋演,因此抑诸,
      *只要知道Emoji表情的Unicode編碼的范圍,
      *就可以判斷用戶是否輸入了Emoji表情爹殊。
      */
     - (BOOL)stringContainsEmoji:(NSString *)string
     {
         // 過濾所有表情蜕乡。returnValue為NO表示不含有表情,YES表示含有表情
         __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;
     }
    

ps:Demo已放在云盤里梗夸,鏈接: http://pan.baidu.com/s/1boguLgN 密碼: keet

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末层玲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌称簿,老刑警劉巖扣癣,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異憨降,居然都是意外死亡父虑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門授药,熙熙樓的掌柜王于貴愁眉苦臉地迎上來士嚎,“玉大人,你說我怎么就攤上這事悔叽±绸茫” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵娇澎,是天一觀的道長笨蚁。 經(jīng)常有香客問我,道長趟庄,這世上最難降的妖魔是什么括细? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮戚啥,結(jié)果婚禮上奋单,老公的妹妹穿的比我還像新娘。我一直安慰自己猫十,他們只是感情好览濒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拖云,像睡著了一般贷笛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上江兢,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天昨忆,我揣著相機(jī)與錄音,去河邊找鬼杉允。 笑死邑贴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叔磷。 我是一名探鬼主播拢驾,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼改基!你這毒婦竟也來了繁疤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稠腊,沒想到半個(gè)月后躁染,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡架忌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年吞彤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叹放。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饰恕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出井仰,到底是詐尸還是另有隱情埋嵌,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布俱恶,位于F島的核電站雹嗦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏速那。R本人自食惡果不足惜俐银,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望端仰。 院中可真熱鬧,春花似錦田藐、人聲如沸荔烧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹤竭。三九已至,卻和暖如春景醇,著一層夾襖步出監(jiān)牢的瞬間臀稚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工三痰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吧寺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓散劫,卻偏偏與公主長得像稚机,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子获搏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容