共计 1620 个字符,预计需要花费 5 分钟才能阅读完成。
最近线上产生了一个问题,共事找我说有个用户名字不对,正则验证不通过。
于是我就去数据库查问看了下这个用户的名字信息,就长这个样子。
没认真看如同没啥问题啊,然而认真看了两遍发现如同不太对,怎么这个字这么宽呢?
我靠,这塔喵的是如同是全角啊!
具体起因就是因为插入的名字是全角的,导致其余中央调用接口取名字用正则判断不通过。
修复这个问题很简略,从新用半角的字体更新一下名字就能够了,另外前端是有校验的,后端没有用正则做校验,须要补上这个校验逻辑。
然而这个问题就很奇怪,这个全角和半角难道没有校验的吗?
带着好奇,我特意测试了一下淘宝、腾讯和头条的注册,看是不是能够保留全角。
首先试了下淘宝,红框中我输出的是全角的手机号,很显著全角是不行的。
再试试QQ注册,发现也是不能够的,这很好,大家都不要全角的。
问题到这里其实很清晰了,前后端在注册的时候必定脱漏了这个校验的逻辑,补上即可。
我再测试了一下匹配英文的正则:
var p = /^[A-Za-z0-9]+$/g
p.match('qqq') // 输入 true
p.match('qqq') // 输入 false
所以倡议大家没有对手机号、名字之类做校验的能够补上一个正则的校验,避免落库的数据是全角,防止坑爹。
这个会引发很多问题,比方如果全角保留的手机号,调发送手机验证码接口,他人校验的是半角的规定,你发送验证码都该报错了!
问题都说完了,无妨再理解下到底什么是全角?什么是半角?
用过输入法大家必定都见过,然而具体的区别可能还真不知道。
在 GB/T 9851.2-2008《印刷技术术语 第二局部:印前术语》中有对应的解释:
2.31 全角 em
排字的度量单位,宽度等于所应用的文字的磅数(point),用作排版宽度程度方向的度量。2.32 半角 en
排字的量度单位,宽度等于同一磅数全角的一半。
大家都晓得,咱们中文字体都是方块字,包含排版也是一样,所以咱们的汉字一个字的宽度是一样的。
然而在英文里就不一样了,一个英文字母的宽度可能是不一样的,所以全角 / 半角的概念诞生就是为了英文而服务的。
它要表白的意思很简略,就是代表 字体宽度 的概念而已。
而实际上,全角 / 半角 这个概念来源于日本,在日文中,角的意思就是正方形,所以全角 / 半角的含意就是整个正方形 / 半个正方形的意思。
这个还有很多叫法,比方全身 / 半身,港台地区叫全形 / 半形,然而无论怎样,这些称说都是在印刷行业的里术语称说。
然而起初,随着计算机的倒退,如同咱们科技界的人不太懂这玩意儿,间接把全角 / 半角搬过去用了,于是就造成了当初咱们晓得的场面。
咱们都晓得,最开始的时候为了映射二进制和英文字母的关系,有了 ASCII 码,它只有 1 个字节,最多也只能表白 256 个符号,而且英文也没用完,只用了 128 个。
然而对于中文和很多其余语言来说,256 个符号必定是不够用的,那咋办呢?那就只能用两个字节了。
所以,随着用户的应用习惯,逐步习惯地把全角当成双字节的中文、韩文,半角当成英文这样子。
在计算机倒退初期的时候,全角 / 半角的概念大略就等同于 单字节 / 双字节 这样的含意,另外还有一层含意就是咱们下面说过的示意宽度,全角示意占用排版的宽度是半角的一倍。
当然了,随着计算的倒退,又诞生了 GB2312、GBK,Unicode、UTF- 8 这些编码,比方 GBK 中文英文都是两个字节,UTF8 下文中 3 个字节,当初的全角 / 半角的概念就和占用存储空间大小没有任何关系了。
所以总结下来啊,全角 / 半角的称说起源日文,然而被谬误的间接带入了科技界(印刷界的人说我都不晓得你们这么牛逼),最后的时候全角 / 半角就是代表宽度的含意,也被约定俗成地赋予了双字节 / 单字节的含意,当初来看它只能用户形容宽度更为适合一点。
还有啊,做好代码的参数校验,这个落库了就麻烦了,否则还得跟我一样去刷一遍数据!
参考资料:
https://zh.wikipedia.org/wiki…
https://www.thetype.com/2018/…