前言。
+(bool)stringcontainsemoji:(nsstring *)string
}} else
if (substring.length > 1)
} else else
if (0x2b05 <= hs && hs <= 0x2b07) else
if (0x2934 <= hs && hs <= 0x2935) else
if (0x3297 <= hs && hs <= 0x3299) else
if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50)
}}];
return
returnvalue;
}複製**
科普。
emoji**就不多說了,只要知道在某個版本的unicode編碼中加入了emoji,並且不是放一塊的,也就說在unicode編碼中,emoji的位址沒有規律可尋,那只能去硬匹配,可emoji數量幾百上千,這乙個個去匹配實在太蠢了,咱得縮小匹配範圍。相信現在大家都用的utf8編碼,這是一種變長編碼,提到變長,那肯定會有乙個描述頭,幾個內容體,utf8是一樣的。 在乙個位元組中,如果第乙個bit位是0,那麼代表當前為單位元組字元,0之後的7位bit為資料部分,代表在unicode中的序號對應的,如果第一位是1開頭,代表是多位元組字元,如果第二位是0,代表這個位元組是多位元組字元的資料位元組,跟在頭位元組後面;如果前面有多個1,則幾個1代表該字元有幾個位元組(包含當前位元組),例如:
110***xx // 代表有兩個位元組,後面一定跟著乙個10開頭的資料位元組 110***xx 10****** 1110***x // 代表有三個位元組,後面跟著兩個10開頭的資料位元組 1110***x 10****** 10******推理可知,utf8中乙個字元最長7個位元組,其中資料位6個位元組,其中emoji在unicode中分布在2、3、4、4+長度的位址中,其中長度為2的emoji大部分是文字字元,這些我們可以放行,4、4+的emoji可全部過濾,而我們可見文字基本都分部在3位元組位址中,這裡重點需要過濾3位元組的emoji(3位元組的emoji已經可以入庫了,但為了統一體驗,還是需要過濾掉),幸運的是3位元組的emoji不是很多,硬匹配也算說得過去。
實現。1.根據從unicode官網找到的資料,匹配三位元組unicode
- (bool) emojiinunicode:(short)code
return no;
} 複製**
2.另外還有很古老的一套emoji,採用unicode私有區域,現在基本沒用了,不過還是過濾下
- (bool) emojiinsoftbankunicode:(short)code
複製**
3.對輸入string的過濾,需要過濾掉位元組長度為非3的字元,然後校驗3位元組的unicode編碼
- (bool) containemoji
// 僅考慮位元組長度為3的字元,大於此範圍的全部做emoji處理
nsdata *data = [self datausingencoding:nsutf8stringencoding];byte *bts = (byte *)[data bytes];
byte bt;
short v;
for (nsuinteger i = 0; i < len; i++)
if ((bt | 0x1f) == 0xdf)
if ((bt | 0x0f) == 0xef)
i += 2;
continue;
}if ((bt | 0x3f) == 0xbf)
return yes; // 不是以上情況的字元全部超過三個位元組,做emoji處理
}return no;
} 複製**
感謝來自oscine的作者xohome的文章。 EditText過濾emoji表情
最近在專案中遇到乙個輸入法自帶emoji表情無法上傳的問題,想到採用禁止輸入emoji的辦法 其實後台資料庫新增emoji表情符是更好的做法,當然有些輸入框確實不需要emoji表情 實現 public class textchangelistener implements textwatcher o...
iOS 獲取emoji表情和攔截emoji表情
12 將數字轉為 define emoji code to symbol x 0x808080f0 x 0x3f000 4 x 0xfc0 10 x 0x1c0000 18 x 0x3f 24 12 3456 78910 1112 1314 void viewdidload 12 3456 7891...
mysql支援IOS的Emoji表情
原因 utf 8編碼有可能是兩個 三個 四個位元組。emoji表情是4個位元組,而mysql的utf8編碼最多3個位元組,所以資料插不進去。解決辦法 將mysql的編碼從utf8轉換成utf8mb4 步驟 1.修改mysql配置檔案 my.ini default character set utf8...