又碰到一个奇葩的BUG

最近线上发生了一个问题,同事找我说有个用户名字不对,正则验证不通过。

于是我就去数据库查询看了下这个用户的名字信息,就长这个样子。

没仔细看好像没啥问题啊,但是认真看了两遍发现好像不太对,怎么这个字这么宽呢?

我靠,这塔喵的是好像是全角啊!

具体原因就是因为插入的名字是全角的,导致其他地方调用接口取名字用正则判断不通过。

修复这个问题很简单,重新用半角的字体更新一下名字就可以了,另外前端是有校验的,后端没有用正则做校验,需要补上这个校验逻辑。

但是这个问题就很奇怪,这个全角和半角难道没有校验的吗?

带着好奇,我特意测试了一下淘宝、腾讯和头条的注册,看是不是可以保存全角。

首先试了下淘宝,红框中我输入的是全角的手机号,很明显全角是不行的。

淘宝

再试试QQ注册,发现也是不可以的,这很好,大家都不要全角的。

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/...


192 声望
68 粉丝
0 条评论
推荐阅读
RabbitMQ、RocketMQ、Kafka延迟队列实现
延迟队列在实际项目中有非常多的应用场景,最常见的比如订单未支付,超时取消订单,在创建订单的时候发送一条延迟消息,达到延迟时间之后消费者收到消息,如果订单没有支付的话,那么就取消订单。

艾小仙阅读 965

最好用的 python 库合集
🎈 分词 - jieba优秀的中文分词库,依靠中文词库,利用词库确定汉子之间关联的概率,形成分词结果 {代码...} 🎈 词云库 - wordcloud对数据中出现频率较高的 关键词 生成的一幅图像,予以视觉上的突出 {代码...} 🎈 ...

tiny极客11阅读 2.9k评论 2

封面图
疫情已过,2023 我的前端面试记录
顺利入职。把我最近找工作的心得记录下来。工作交接确定 lastday整理手头工作,相关对接人、交接人放文档中工作交接过渡阶段。做好被咨询者,该拉人拉人,该拉群拉群平时沟通顺畅的同事如果没有 WX 可以加一个属...

linong11阅读 487

花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥11阅读 1.1k

封面图
Fork:剖析「云计算大楼」中的每一块砖|开发者说
当时,随着移动互联网大潮的涌起,七牛云的图片、音视频存储业务获得迅猛发展,主要目标客户是各式各样的移动应用 App。面对层出不穷的 App,七牛云的销售人员希望精挑细选,从而挖掘到更有价值的客户。于是,他...

万事ONES3阅读 12.4k评论 1

封面图
Vland:像乐高一样搭建元宇宙|开发者说
活跃于各种社交活动,是金秋远在贝恩咨询为 500 强企业担任战略顾问时养成的习惯。由于喜欢研究「人与人的连接」,金秋远先后在滴滴、探探两家公司负责运营和产品。他始终觉得,人际连接仍然是值得挖掘的创业方向。

万事ONES3阅读 14.4k

封面图
Eolink: 数字化企业连接世界的第一接口|开发者说
2015 年底,刘昊臻想更好地管理团队内部的 API,但市面上的产品并不能满足需求,于是,他决定做个产品来解决 API 协作问题。没想到,这个产品不仅解决了自己的麻烦,还可以解决所有 IT 团队遇到的有关 API 的共同...

万事ONES4阅读 12.7k

封面图
192 声望
68 粉丝
宣传栏