unity inputfield 過濾emoji輸入


unity版本:unity2017.1.5f1

復現步驟:InputField在安卓手機InputField連續輸入兩個emoji會報錯

報錯內容:

2020-01-08 19:56:38.366 22894-22931/? E/Unity: ArgumentOutOfRangeException: Argument is out of range.
    Parameter name: index
      at System.Collections.Generic.List`1[UnityEngine.UICharInfo].get_Item (Int32 index) [0x00000] in <filename unknown>:0 
      at UnityEngine.UI.InputField.SetDrawRangeToContainCaretPosition (Int32 caretPos) [0x00000] in <filename unknown>:0 
      at UnityEngine.UI.InputField.UpdateLabel () [0x00000] in <filename unknown>:0 
      at UnityEngine.UI.InputField.SendOnValueChangedAndUpdateLabel () [0x00000] in <filename unknown>:0 
      at UnityEngine.UI.InputField.LateUpdate () [0x00000] in <filename unknown>:0 
     
    (Filename:  Line: -1)

  看報錯 可看出是一個長度越界的錯,結合代碼內容和bug復現,發現報錯總是發生在輸入兩個emoji時,也就是在輸入時獲取字符長度報錯。

查閱資料,發現在ios上不會出現這樣的問題

https://unity3d.com/unity/qa/patch-releases/5.3.4p1?_ga=2.154473848.1772582649.1578484654-1798539839.1575364585

iOS: Added a compile flag in the trampoline code in order to allow the user to disable the filtering of emoji characters.

因此只需要處理安卓的即可

參考了幾位大佬的總結:

Unity之輸入框屏蔽Emoji表情

各種字符的unicode區間

結合官方給的

Emoji Unicode Tables

字符類

總結一下,就是過濾掉emoji的輸入

方法:通過監聽InputField的輸入,獲取當前輸入字符串內容,通過正則匹配,發現有emoji,直接替換為空字符串

達到過濾emoji輸入的功能。

核心代碼如下:

        List<string> patten = new List<string>() { @"\p{Cs}", @"\p{Co}", @"\p{Cn}", @"[\u2702-\u27B0]" };

        private string FilterEmoji(string str)
        {
            for (int i = 0; i < patten.Count; i++)
            {
                str = Regex.Replace(str, patten[i], "");//屏蔽emoji   
            }
            return str;
        }

這里屏蔽了絕大多數emoji 可根據自己需求放寬匹配規則。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM