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
at UnityEngine.UI.InputField.SetDrawRangeToContainCaretPosition (Int32 caretPos) [0x00000] in
at UnityEngine.UI.InputField.UpdateLabel () [0x00000] in
at UnityEngine.UI.InputField.SendOnValueChangedAndUpdateLabel () [0x00000] in
at UnityEngine.UI.InputField.LateUpdate () [0x00000] in
(Filename: Line: -1)
看报错 可看出是一个长度越界的错,结合代码内容和bug复现,发现报错总是发生在输入两个emoji时,也就是在输入时获取字符长度报错。
查阅资料,发现在ios上不会出现这样的问题
iOS: Added a compile flag in the trampoline code in order to allow the user to disable the filtering of emoji characters.
因此只需要处理安卓的即可
参考了几位大佬的总结:
结合官方给的
总结一下,就是过滤掉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 可根据自己需求放宽匹配规则。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章