unity inputfield 过滤emoji输入

unity版本:unity2017.1.5f1ios

复现步骤:InputField在安卓手机InputField连续输入两个emoji会报错app

报错内容:spa

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时,也就是在输入时获取字符长度报错。.net

查阅资料,发如今ios上不会出现这样的问题3d

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

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

所以只须要处理安卓的便可unicode

参考了几位大佬的总结:字符串

Unity之输入框屏蔽Emoji表情

各类字符的unicode区间

结合官方给的get

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 可根据本身需求放宽匹配规则。

相关文章
相关标签/搜索