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

unity inputfield 过滤emoji输入的更多相关文章

  1. UITextView/UITextField检测并过滤Emoji表情符号

    UITextView/UITextField检测并过滤Emoji表情符号 本人在开发过程中遇到过这种情况,服务器端不支持Emoji表情,因此要求客户端在上传用户输入时,不能包含Emoji表情.在客户端 ...

  2. js过滤emoji表情符号

    手机端常常会遇到用户输入框,输入emoji,如果是数据库是UTF8,会遇到报错:SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for ...

  3. Js 过滤emoji表情...持续补充中..

    原文来自: https://www.cnblogs.com/tsjTSJ/p/7065544.html 最全最详细的用JS过滤Emoji表情的输入   在前端页面开发过程中,总会碰到不允许输入框输入e ...

  4. java代码过滤emoji表情

    可以新建一个过滤器的类,在类中书写如下代码: public static String filterEmoji(String source) {           if(source != null ...

  5. java过滤emoji表情(成功率高)

    转载自:http://blog.csdn.net/huangchao064/article/details/53283738 基本能过滤大部分的ios,安卓,微信emoji表情 有很多别的帖子搜出来很 ...

  6. 过滤特殊字符(包括过滤emoji表情)

    /** * 过滤特殊字符 * @param $text * @return mixed */ public static function filterSpecialChars($text) { // ...

  7. python3 清除过滤emoji表情

    python3 清除过滤emoji表情 方法一: emoji处理库,emoji官网:https://pypi.org/project/emoji/ #安装 pip install emoji 官方例子 ...

  8. Unity Android设备的输入

    Unity Android设备的输入 1依据屏幕位置输入 有的时候也许是为了整个有些风格的干净,减少屏幕上的UI图标,以至于摒弃了虚拟按键这种常用的输入方式.为了替代虚拟按键的输入方式而选择了依据点击 ...

  9. android实现emoji输入

    学android也有一段时间, 一直都是自己摸索, 各种上网查资料, 也明白了不能一味去索取有时间也要分享一些自己的心得 . 最近几天都在写关于android emoji输入的小例子,网上有不少源码还 ...

随机推荐

  1. hdu4277 DFS+SET

    题意:       给你一些木棍,问你可以组成多少个三角形.. 思路:      直接深搜,N很小深搜无压力,也可以直接算出来,但我不会算..  #include<stdio.h> #in ...

  2. hdu3786 Floyd或搜索 水题

    题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. LA3403 天平难题

    题意:      给出房间的宽度r和每个吊坠的重量wi,设计一个尽量宽但宽度不能超过房间宽度的天平,挂着所有挂坠,每个天平的一段要么挂这一个吊坠,要么挂着另一个天平,每个天平的总长度是1,细节我给出题 ...

  4. hdu5012 水搜索

    题意:       给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下. 思路:        ...

  5. 16.PHP_Ajax模拟服务器登录验证

    Ajax模拟登陆验证 index.php <script language="javascript">    var http_request = false;     ...

  6. postman使用教程7-参数化引用外部文件测试数据

    前言 当同一个接口需要测试不同的参数时,需用到参数化的概念.postman支持从外部文件读取测试数据参数化 设置参数化变量 新建一个collections 专门测试登录接口 设置集合变量usernam ...

  7. html单页面中用angular js

    1.引入angluar js文件 2.html页面应用区域中加入(ng-app="myApp" ng-controller="myController"),区域 ...

  8. Mac安装python 环境& pychaem

    一.文档说明 在Mac上其实自带python环境,但是很多的library安装python是2.7的版本. 验证:可以在终端Terminal中输入:python 如下图是未安装之前,但是咱们需要在自己 ...

  9. @JsonFormat 格式化时间 时出现时间不准确问题

    今天突然报个问题,简单来说说就是数据库某一字段的记录时间为 14点,然而展示到前台却是 6点 我腚眼一看,postman测试的数据也是6点 然而idea查出来的并不是6点 再仔细一瞅idea实体类的时 ...

  10. Pytorch系列:(五)CNN

    卷积 Conv2d 2D卷积函数和参数如下 nn.Conv2d( in_channels, out_channels, kernel_size, stride=1, padding=0, dilati ...