目录
场景描述&排查
在前后端分离的交互当中,对一个JSON转换成object对象时出现了这样的问题
异常的字符索引为10,也就是说那个空格有问题。
把异常的日期字符串抓出来对比了一下
奇怪。两个空格明明长得是一模一样的,为什么会报错呢?
两个运行试一试。
戏剧性的问题出现了。两个一模一样的日期字符串,一个能正常运行,另一个不能。异常依旧说明那个不能正确运行的日期字符串中的空格有问题。但是根据上面的排查已经确定了那个空格并非全角空格,全角空格会比半角空格“胖”一点很容易用肉眼看出来区别。
排查到这里仿佛陷入了尴尬的境地,直到我想起了字符的ASCII码...毕竟肉眼可见的问题已经排查完了,现在就剩下肉眼不可见的东西还没排查了。
在java中,想要拿到某个字符的ASCII码需通过int类型来接收。当然想要从字符串里面拿到某个字符的ASCII码还得这么写:
接下来是获得两个空格的编码。
运行
可以看到那个正常的空格是32,对应ASCII码表是正确的。但是这个160的空格是怎么弄出来的呢?
毕竟这个有问题的日期字符串是前端传递过来的,也就是说前端在拼接日期字符串的时候使用了不合适的空格。
最后询问了一下前端发现前端使用的是 '\xa0' 作为空格的拼接符...
原因
前端使用了一个不合适的空格替换符 '\xa0'。导致后端日期格式转换器无法识别这样的空格出现异常。
处理
前端将 '\xa0' 换成32码点的空格(手打的空格)解决问题;