产品同学过来反馈,说用户填写的姓名中有特殊字符,后端校验不过,看前端能不能过滤一下。经具体了解后,问题集中在少数民族姓名中的间隔符点上。
不就是个点么,校验的时候,让这个点合法通过不就行了。似乎很简单,但具体操作时还是会发现并不如想的那么顺利。
经测试发现,类似中间点有好几个,比如:•・·,在使用Mac自带输入法输入时,第三个还是google后才知道如何输入的(opt+shift+9)。下面看下这几个点对应的Unicode值。
Unicode
说到Unicode,都很熟悉,大致理解就是一个通用的字符编码集。这里查下维基百科,对其做一个全面的了解。引用一下 Unicode中介绍:
Unicode,中文又称万国码、国际码、统一码、单一码,是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。
在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面(英语:Basic Multilingual Plane,简写BMP。又称为“零号平面”、plane 0)里的所有字符,要用四个数字(即两个bytes,共16 bits,例如U+4AE0,共支持六万多个字符)
不多深入,这里接上文列一下刚才那几个点对应的Unicode编码(查询网址)
- • U+2022
- ・U+30FB
- · U+00B7
到此已经很好理解三个点的具体区别了,选定一个公认的,如果用户输入的是其他的,可以自动将其转换为统一的一个即可。
经查询,国家对这个点是有统一标准的:
这份由国家民委、教育部、工信部、公安部、民政部、人社部、住建部、交通运输部、国家卫计委、人民银行、工商总局、保监会等12个部门联合发布的通知规定,对姓名中间的“点”,严格按照国家标准,统一采用“·”(GB13000编码为00B7,GB18030编码为A1A4)表示;
国标的GB13000对应Unicode的1.1版本,所以统一将输入的中间点转换为U+00B7,即可避免输入不一致的问题。
在手机上输入时发现,android手机默认输入的是U+2022,iOS默认输入的是U+00B7
全角/半角
在看Unicode的时候,发现有提到全角/半角,那么为什么要分全角/半角,为何用“角”这个字呢,带着一点点疑问,查了下维基百科,发现一点有意思的内容:
“半角/全角”源于日文,其中“角”是“方块”的意思,“全角/半角”在日文里即是原本“正方形/半个正方形大小文字”的本意,与西文字体排印学中Em和En单位含义相同。
而中文里的“角”虽然有“角度”“角落”等含义,却没有“方块”的意思,中文在字体排印时不说“全角/半角”而说“全身/半身”。中文里说“半角/全角”是计算机文字编码技术引入时直接借用了日文的做法。