做跨境业务的人往往会问同一个问题:有没有一套通用规则,直接校验所有国家的证件号?答案是没有,而且这不是暂时没人整理,而是结构上就不可能。理解为什么不可能,比记住任何一份清单都重要,因为清单会过时,而原因不会。
各国证件号为什么不能统一校验?
证件号是行政管理的产物,不是技术标准。每个体系在制定规则时考虑的是本国登记流程、防错需求与历史沿革,没有一个跨国机构强制它们对齐。于是位数、字符集、是否带校验位、校验位怎么算,全都各自决定。
更麻烦的是同一国家内部也可能不统一。同一个体系里可能存在多套并行的编号规则,或者规则随签发时间与签发机关变化,老号码与新号码形状不同却都仍然有效。这种情况下,任何写死的正则表达式都会在某个时间点开始出错。
因此现实的做法不是追求通用规则,而是承认规则的属地性:把每个可校验的体系当成独立单元,各自带自己的说明与依据,最后只在结论层统一成同一种表达方式。
按本地能确认的程度,可以把遇到的体系分成三类,处理方式也因此不同:
| 体系类型 | 本地能确认什么 | 建议给出的结论 |
|---|---|---|
| 公布算法 | 形状与校验位 | 校验通过或校验失败 |
| 只有形状 | 字符集与长度 | 仅格式 |
| 形状不定 | 只有明显异常能被排除 | 仅格式,并提示人工核对 |
公布校验位算法的制度
有一类体系会把校验位算法写进公开文档:号码的哪些位参与计算、用什么权重、对哪个模数取余、余数怎样映射,都能查到。对这类体系,本地校验可以做到算术层面的确认。
这类文档的价值不只是让人实现一次算法。它同时给出了判断依据:当校验失败时,你可以明确地说这是按该体系公布的规则算出来的结论,而不是凭经验猜的。可追溯的结论,对排查数据问题远比一个孤立的通过与否有用。还要留意的是,算法文档的更新往往滞后于实际签发。现实中存在仍在流通、却不符合最新版说明的号码,因此校验失败不等于数据错,可能只是版本差。报告里保留规则版本,能让这类情况被识别出来。
值得注意的是,公开算法通常也只覆盖号码的一部分规则。算法文档会告诉你校验位怎么算,却不一定告诉你号码的号段分配、有效性期限或状态变化。能算对校验位,距离「这个号码当前可用」还有一层距离。
只有格式、没有公开算法的制度
更多体系属于另一类:你可以从公开渠道了解到号码大致长什么样,但找不到一份完整的算法文档。于是只剩字符集与长度可判断,得到的结论应当明确写成「仅格式」。
把这类结论折成「有效」是常见错误,后果是给用户一个并不成立的保证。用户看到合格标记,就认为系统已经替他把关,反而放松了核对;一旦数据是错的,追溯起来还会以为是系统验证过的东西。
还有一类更边缘的情况:号码的形状由签发机关和签发批次决定,公开信息只描述了大致规律,没有能写死的边界。这种输入只能当作自由文本处理,做最基础的长度与非空检查,并把是否可信交给后续的人工或权威渠道。
一个号码对上多个国家时怎么办?
不同体系对形状的规定偶尔会重叠:某些国家的号码在位数与字符集上与另一国的相近,于是同一个输入可能同时满足多套规则。这不是数据出了问题,而是规则之间天然存在交集。
此时不要急于给出唯一答案,也不要用被支持国家清单的顺序去「优先匹配」——那等于用实现的偶然顺序冒充判断。更诚实的做法是把所有成立的制度并列出来,各自注明依据,让知道号码来源的人自己去认。
如果并列结果为空,结论应当是本地没有对应规则。这句话的含义只关于工具能力,不关于号码真假,措辞上必须分开。把「我不认识」写成「它是假的」,是这类工具最常见的表述事故。
还有一种情况值得提前约定:同一个字段里混有多种体系的号码。批处理时应当先按形状分流,再分别校验,最后在报告里标明每一条属于哪一类。混在一起统计,得到的分类数字既不好看也没有用。
长度与字符集只是起点
长度与字符集的检查便宜、可靠、不需要任何表格维护,因此值得放在最前面。但它只能拦下明显不对的输入,拦不住位数正确而内容写错的情况。
把这三层的作用范围想清楚,就不会对结论抱有不切实际的期待:字符集挡符号,长度挡截断与多输,校验位挡算术层面的抄录错误,登记状态只有权威查询才知道。这四者不是同一个层级的判断,混在一起描述必然产生歧义。
对多国数据来说,长度还有一个隐藏用途:它可以作为分流线索,把输入缩小到少数几个候选体系,再去查表。但这只是效率优化,不能当作结论依据。字符集的作用类似,它能挡掉明显的粘贴事故,例如把整行文本粘进了号码字段;真正的判断仍然发生在查表之后。
给开发者:把国家规则做成数据
建议把规则从代码里搬出来,做成带依据字段的数据:每个体系的标识、字符集、长度约束、算法参数、以及这条规则的来源说明。代码只保留执行引擎,负责按参数计算并统一输出结论。
这样做的好处是新增或修正规则不必改动逻辑,回滚也只是一条数据记录的变更。规则数据必须带版本与来源,否则过一段时间就没人敢改,也没人说得清某条结论当初依据什么。结构分层与归一化的通用做法,可对照号码校验的原理;算法参数怎么抽成三项,见校验位算法家族。
千万别在数据里塞真实号码作为测试样例。用明显合成的占位值,或者用只验证形状的断言;需要真实分布时先脱敏再隔离,别混进版本库。
下一步
把你手上几条来自不同体系的输入依次粘进号码校验工具,留意每条结论后面写的依据是什么——若某条只给了「仅格式」,说明该体系没有公开算法,你的流程里就该保留人工核对。要多国规则的组织方式,可参考CPF 与 CNPJ 校验:巴西两种税号怎么验里两套号码并存的处理思路。
本文不列举任何国家的具体号码规则,也不评价任何号码的有效性;文中所有描述均为结构性说明,不能作为判断某张证件或某个号码真实、有效或可用的依据。