java校验中文姓名合法性(需要支持生僻字与分隔符·)

背景:

国家民委等单位关于在政府管理和社会公共服务信息系统中统一姓名采集应用规范的通知


对中文姓名合法性校验时,需要支持所有GB18030中涉及到的汉字(包括生僻字),并支持部分少数民族姓名中带有分隔符 ·的问题


思路:

首先考虑生僻字的问题,目前GB18030-2005《信息技术中文编码字符集》是我国自主研制的以汉字为主并包含多种我国少数民族文字(如藏、蒙古、傣、彝、朝鲜、维吾尔文等)的超大型中文编码字符集强制性标准,其中收入汉字70000余个,可以说GB18030目前是包含汉字最全的字符集;这样我们就可以基于GB18030来校验汉字的问题

目前我们绝大部分的java项目的编码都是采用UTF-8或者是GBK,那么它们和GB18030的关系是什么样的呢,先说一下GBK,简单来说GBK里面包含的汉字是GB18030的子集,GBK收录的汉字在2W多,这样来说,如果考虑到所有的汉字,使用GBK其实是不全面的,故可以排除使用GBK这种字符集来做汉字校验啦。

UTF-8是什么呢?从百度百科贴了一段:UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到4个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

说白一点,就是UTF-8就是相当于unicode的一种展现方式,而且所有字符集内的字符 对应着unicode都是有固定的编码的,也就是说GB18030中所有的字符都可以对应到unicode的编码,这样我们如果采用UTF-8字符集也就可以实现全汉字的一个展现;

解决方案:

只要将GB18030中的汉字对应到unicode中的代码区域,在校验字符串时,看该每个字符是否在代码区域中,即可判断是否是属于汉字,补充说明一下GB18030,GB18030中的汉字对应的unicode的方式是不一样的,举例说明一下:

汉字 GBK(GB18030)编码 Unicode编码
D2BB 4E00
B6A1 4E01
一对应的unicode的编码是4e00,这样的对应关系GBK和GB18030中大概有2W多常用汉字


汉字 GB18030编码 Unicode编码 UTF-16编码

你可能感兴趣的:(java校验中文姓名合法性(需要支持生僻字与分隔符·))