美文网首页
iOS Unity中Unicode零宽字符导致显示问题

iOS Unity中Unicode零宽字符导致显示问题

作者: MQ_Twist | 来源:发表于2021-12-03 17:53 被阅读0次

好运不会眷顾傻瓜。

前言

年初公司在iOS项目中集成一个Unity项目(小游戏),老板是越想越觉得好,于是乎国庆之后我就参与了Unity开发,从0开始,简单的一周学习时间就开始上手,磕磕绊绊算是把东西做完了,然后有个问题算是困扰了我2天时间。

正文

  • 用户名显示问题

抓包工具展示的数据

{
  "rank_num": 1,
  "user_id": 82346121,
  "user_icon": "/test/ufile/head/20210312/82346121/73471615540423.jpg",
  "user_name": "82321",
  "hero_tot_num": 31,
  "god_num": 0,
  "god_will_num": 31,
  "famous_will": 0
}

iOS上Unity显示效果

显示效果
看着是没有什么问题,但是就是显示的时候出现有竖纹,百思不得姐。期初认为是Unity控件用的不对,各种修改,无用,后来也想到是不是编码格式有问题,然后编码格式转换,依然无用。今天突发奇想,把82321复制一下到其他地方,当我一点一点删除的时候,恍然大明白,里面有零宽字符。其真是面目是这样子的:
{
  "rank_num": 1,
  "user_id": 82346121,
  "user_icon": "/test/ufile/head/20210312/82346121/73471615540423.jpg",
  "user_name": "\u202d\u202d823\u202d\u202c21\u202c",
  "hero_tot_num": 129,
  "god_num": 33,
  "god_will_num": 66,
  "famous_will": 30
},

更加有意思的是,这玩意儿再iOS上显示是没有问题的, 估计是苹果做了优化,有图有真相:


iOS显示效果

所以iOS方面就暂时不做处理,Unity的处理方式本来想着过滤不可打印字符,但是用户名里面有Emoji表情就放弃,也可以用正则,目前用的最笨的方式,代码如下:

public class StringUtility
    {
        private static string[] Pattern = { "\u202b", "\u202c", "\u202d", "\u200b", "\u200cb", "\u200d" };
        /// <summary>
        /// 过滤Unicode零宽字符
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string FillterZeroWidthStr(string str)
        {
            if (str == null) return str;
            foreach (var pattern in Pattern)
            {
                if (str.Contains(pattern))
                {
                    str.Replace(pattern, "");
                }
            }
            return str;
        }
    }

后记

说实话,我也是最近才知道有零宽字符这个东西,一百度,人家早就玩嗨了好吗!有兴趣的可以去瞅瞅。
Unicode 字符还能这样玩?

相关文章

网友评论

      本文标题:iOS Unity中Unicode零宽字符导致显示问题

      本文链接:https://www.haomeiwen.com/subject/ikewtrtx.html