iOS 過濾emoji表情

2021-09-11 12:02:25 字數 2030 閱讀 9179

前言。

+(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...