阅读 192

特殊不可见字符导致excel数据校验出错

前情提要

昨天晚上,突然有运营过来说,导入excel的时候,校验数据时有一个电话号码一直报错:电话号码不正确,当时百思不得其解,但由于时间太晚,所以放到第二天再来处理。

发现问题

一大早跑到公司,第一件事就是修复这个bug,最开始以为是空格的原因,因为电话号码是没有做去空格处理的,加上!立马加上!但是测试下来依旧是报错,没办法,只能找到后端一起解决问题,后端马上发现了问题,电话号码没有通过正则校验:^(1)\d{10}$。 于是先手动输入这个号码进行校验,发现是可以通过的,那么马上就想到了可能是数据问题,然后去传入的参数处复制该号码,发现也能通过校验,于是就认定了,锅肯定是后端的,甩就完事了。 后端最开始以为是传入过程中不小心加入了空格,导致正则校验失败,于是加上去除空格,但是发现还是不行,而且发现只有这个excel的某个单元格输入任何号码都报错,于是我又去参数处取值,这时将引号也取进去,然后删除引号,进行校验,无法通过! 这时就意识到是这个数据出现了问题,于是对11111111111进行unicode编码,结果为

‭11111111111
复制代码

问题出现了,转码后的长度为12,而且暴露出了一个奇怪的东西:&#8237。 问题出现之后,就是查资料了,结果发现在某些操作系统或者某些版本的excel下,会加上某些不可见的编码,这也是为什么前端和后端打印的时候都没打印出来,也没发现异常,只需对此字符串处理删除特殊字符即可

str=str.toString().replace(/[\u200b-\u200f\uFEFF\u202a-\u202e]/g, "")
复制代码

最后

问题解决了,也是第一次知道会有这类不可见字符,看来需要学习的路还是相当漫长的,哈哈。 同时我的前端excel处理插件pikaz-excel-js中的导入部分也加入了去除空格和特殊字符的功能,欢迎大家来提issue,一起完善它,谢谢。