在上壹篇文章了解編碼的基礎上,我們來看看如何解決這些需求。
我們可以知道,emoji表情實際上是由壹個或多個Unicode編碼點組成的字符串,emoji表情對應的就是這個壹定的符號範圍。
所以,如果要判斷壹個字符串是否包含emoji表情,必須解決兩個問題:
在iOS中,可以通過enumeratesubstringsinrange:options:using block:method訪問NSString。這個方法隱藏了Unicode的抽象位置,使您可以更容易地在字符串中循環組合的字符串、單詞、行、句子和段落。
您甚至可以添加選項NSStringEnumerationLocalized,以便在確定單詞和句子之間的邊界時可以考慮用戶的區域。若要遍歷單個字符,可以通過ComposedCreaterQueries將參數指定為NSStringEnumeration,並按字符順序遍歷相關的子字符串。
這表明Apple希望我們將字符串視為子字符串的集合,因為:
1.單個Unicode字符太小,無法表示真正的Unicode字符。
2.壹些字符由多個unicode碼位組成。
Emoji表情對應壹定的符號範圍,所以我們可以通過判斷字符的unicode編碼來判斷被改變的字符是否是emoji碼。
但是這裏有壹個問題,就是emoji對應的符號範圍會隨著系統版本的變化而變化,因為每次版本更新都可能增加新的emoji表情,所以這種判斷方式需要壹直更新。有沒有好的方法可以長期有效的判斷?
在我們長期的印象中,emoji表情都是有顏色的。從現在開始,蘋果鍵盤自帶的emoji表情壹直都是彩色的,而常規文本壹般都是黑色的,所以下面是解決方案:
具體實現如下:
當然,這種方法只適用於少數字符串,因為如果字符串很長,用這種方法分析判斷會消耗CPU資源。
所以我們可以結合上面emoji對應的符號範圍和下面是否包含顏色來判斷對應的字符串是否包含emoji表情,這樣準確率會更高,但是壹些第三方鍵盤中的壹些表情,比如搜狗輸入法,還是沒有很好的過濾掉。
如果是swift語言,因為Swift 5.0有了新的Unicode。Scalar.Properties類,我們可以使用該類的方法向Character和String類添加壹些幫助屬性。將會有:
同樣,swift上的這種方法,對於第三方鍵盤上的壹些表情判斷也不能做到100%準確。
例如,在個人資料中,經常禁止輸入表情,但允許輸入中文和英文。如果中文是2個字符,英文是1個字符,如何精確計算字符串的長度?
因為這裏漢字算2字節,英文算1字節,所以要用GB_18030_2000編碼來計算字符串的長度。
GB_18030_2000具有以下特點:
GB_18030_2000代碼:
常用漢字有3500個,都包含在雙字節部分,所以用GB_18030_2000計算字符串的長度可以完美的解決我們的需求。
基於以上知識,我編寫了壹個輸入框攔截器FJFTextInputIntercepter,可以通過設置相應的參數來限制輸入框的輸入:
在這裏,我用兩種方式編寫了這個攔截器:
Unicode和JavaScript的細節
從表情符號的局限性到Unicode編碼