菜单

ISBN 与 ISSN 校验位:书号刊号最后一位怎么来

书号与刊号都带校验位,书号还有两套并行的体系,其中一套的校验位可能是字母 X。本文讲清两者的差别、号段分配方式,以及为什么换过号的书要两套都接受。

发布于

  • 书号
  • 校验位

图书和期刊是最早把校验位用到极致的领域之一:它们的编号要跨越图书馆、书店、电商与数据库,任何一处抄错都会让一条记录指向另一本书。因此在书号体系里,校验位不是可选项,而是编号本身的一部分。

ISBN 和 ISSN 的校验位怎么算?

两者的校验位都遵循同一类思路:把编号前面的位按位加权、求和、对模数取余,再按规则映射成最后一位。参与计算的权重逐位变化,所以改动任意一位都会影响结果。

差别在于用途:书号标识的是一本书或一个版本,刊号标识的是一种期刊。这个区别决定了它们的结构——书号要在一串里同时容纳注册组、出版者与书名三个层级的标识,刊号则只需标识期刊本身,因此在长度与分段上的要求完全不同。

两者的校验都只能确认字符自洽。一本书是否真的出版过、某个刊号是否仍在发行,都属于登记信息,不在算法回答的范围内。

两套书号体系的差别

书号存在两套并行的体系:较早的一套位数较少,较新的一套位数较多。新的体系在设计时考虑到了编号资源的枯竭问题,同时给标识空间留了更大余量,因此在原有信息之外还容纳了一段额外的标识。

两套体系现在同时存在。新出版的图书使用新体系,而大量旧书的记录仍然保留旧号,许多数据库甚至同时保存两种形态以备交叉查询。因此任何面向图书数据的系统,几乎都必须同时接受两套输入。

从实现角度看,两套体系的差别不到需要写两份逻辑的程度:校验算法的骨架相同,参数不同,长度不同,分流方式也就有了依据。

对比项 较早的一套 较新的一套
位数 较少 较多
标识空间 较小 更大
校验位写法 可能是数字或字母 通常为数字
当前使用情况 旧书号仍在使用 新书普遍采用

校验位可能是字母 X 的情况

在较早的那套体系里,校验位的取值范围不是零到九,而是包含了一个额外的取值,规则规定它写成字母 X。原因是模数比十进制基数的取值范围大,余数会多出一种可能,因此必须为它指定一个书写符号。

这一点对实现的影响不小。校验位位置上的字符可能是数字也可能是字母,所以字符集检查不能限制为纯数字;比较时还要统一大小写,否则用户输入的小写字母会被判为不合法;归一化之后要把字母还原成规定的取值再参与计算。这几步里最容易出错的就是最后一步:字母在计算前要替换成一个固定取值,而不是按字母表顺序随手取数。替换方式写错,所有以字母结尾的输入都会系统性算错。

类似的设计在别的体系里也能见到,可对照校验位算法家族里关于余数与映射的讨论。凡是以大模数取余的算法,都需要回答「余数落在这个取值上怎么写」这个问题。

如果实现时把校验位位置限制为纯数字,那么合法输入里会有一小部分被误判为字符集错误。这类误判并不常见,却很难复现,因为触发条件只在特定余数上出现,测试用例覆盖不到就长期潜伏。

号段是怎么分配的

书号里的号段不是随机数,它由负责注册的机构按层级分配。最前面是注册组,表示语言的注册范围;其后是出版者段,逐家分配;再往后是书名段,由出版者自行编排。三段长度并不固定,需要在一串总长度里动态切分。

因此书号里的连字符位置不能按固定位置推算,它取决于各段实际分到的长度。很多系统在展示时会主动插入连字符,把号段视觉分开,但这一步需要查表,猜位置会导致错误的分段。

刊号的分配方式更简单,它由国际中心按注册范围划分,编号本身不含出版者层级。这也解释了为什么刊号通常无需分段显示。

分段带来的另一个后果是排序。按字符串排序时,同一出版者的书号不会自然相邻,因为出版者段之后还接着长度不定的书名段。需要按出版者归组时,应当先把号段解析出来分别入列,而不是依赖原始字符串的先后顺序。

为什么换过号的书要两个都验?

因为两套体系里的同一个出版物对应两个不同的编号,而这两种编号在现实数据里都会出现。旧书的版权页印的是旧号,新版的记录用的是新号,许多系统甚至把两者都存成字段。

查询时若只接受一套,就会把另一套当成格式错误,或者干脆查不到记录。这在数据合并、渠道对账这类场景里会直接损失记录。因此更稳妥的做法是:两套编号都接受、都校验,只在输出上标明属于哪一套。

需要提醒的是,两套编号之间通常不能靠算术互相推导——它们不是简单地在原有编号前后加字符。要做映射,只能依赖登记数据里的对应关系。

因此,如果你的系统只存一列编号字段,至少要允许两种长度共存,并在入库时记录这条编号属于哪一套体系。等到需要对外展示或与渠道对账时,这个标注能省掉大量人工比对。把两套编号硬塞进固定长度的字段,是后期最难修的数据债之一。

给开发者:输入归一化与连字符

实装时的顺序建议是:先去掉用户输入中的连字符与空格,统一字母大小写,再做长度分流,最后算校验位。若用户按出版方习惯写了连字符,去掉它不会影响校验结果。

输出时要不要重新加连字符,取决于号段表是否可用。没有表就别猜,直接返回去掉了分隔符的规范化值,比给出一个错误的分段安全。分段错误的下游影响比格式朴素更大。

校验失败时,提示信息最好说明是按哪一套体系的规则算的,并提示用户核对版本。图书数据里新旧号混用非常普遍,用户往往只是看错了版权页。若输入其实来自商品条码,那套规则不适用,见EAN 与 UPC 条码校验位。另外,展示层最好同时给出规范化值与原始输入。图书数据常从纸质来源誊写,用户需要把系统里那一串与纸上那一串逐位对照,少了原始值就没法核对,这在补录旧书目时尤其明显。

下一步

把手上的一串书号或刊号粘进号码校验工具,确认它被判为哪一套体系、依据是什么。若你要建立图书数据校验流程,先把新旧两套编号的接受顺序定下来,再动手写清洗规则。

证件号校验位那篇从另一类编号的角度讲了校验位的用法,可与本文对照阅读。

本文只讨论书号刊号的公开结构与校验思路,不提供任何真实编号;文中校验只能说明字符是否自洽,不代表某本书或某种期刊真实存在、可获取或仍在使用。

继续阅读

卡号与身份证号校验工具相关文章