好运不会眷顾傻瓜。
前言
年初公司在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 字符还能这样玩?
网友评论