我挺喜欢编程的,一旦有点闲暇,就会写点小程序,用来磨砺一下脑子。
我的“任氏有无轩”站点就是如此慢慢慢慢地成型的,从2010年前后开始,我就用PHP以及Symfony框架开始构造,到现在也已经有10几年了。
最近这一两年,AI很时髦,所以我也试着用AI来帮助我写程序。
在我看来,写程序至少有两个好处。
首先是锻炼脑子。脑子是个好东西,而且需要不断地磨炼。
其次是学习一些新的、也许很冷的知识。
今天我倒是学到了一个新的冷知识:如何判定一本书的ISBN号是正确的?
如同人有身份证作为身份的标识外,书籍也有自己的身份标志,也就是ISBN(International Standard Book Number)号。一个ISBN号有13位(2007年后)或者10位(2007年前),这是一个ISO(International Organization for Standardization,国际标准化组织)标准,编号是ISO 2108。
我们先看如何解读一个13位的ISBN号。就拿我刚买的这本《美国文明的兴起》(上下卷)为例,它的ISBN号是978-7-100-07036-2。
它一共有五个部分:
978是所谓的“前缀”,目前只有两个:要么是978,要么是979。以后应该会有更多的号码。7是所谓的“大分组”。一个国家和地区都有一个代码。无论是汉语的影响力还是出版物数量都是巨大的,所以理所当然获得了一个一位数的代码:7(区域代码)。当然,英语的影响力更大,所以英语出版物的大分组代码有两个:0和1。其他一位数国家、区域和语种代码是:- 法语:2
- 德语:3
- 日本:4
- 前苏联:5
- 其他:6/8/9
100:出版社、出版商代码。以《美国文明的兴起》为例,其出版社是商务印书馆。根据任氏有无轩的收藏记录,中国大陆的出版社中,代码比较小的依次是:- 01:人民出版社
- 02:人民文学出版社
- 04:高等教育出版社
- 100:商务印书馆
- 101:中华书局
- 108:三联书店
- 111:机械工业出版社
- 119:外文出版社
- 121:电子工业出版社
- 208:上海人民出版社
- 301:清华大学出版社
- 309:复旦大学出版社
- 313:上海交通大学出版社
- ……
- 5327:上海译文出版社
- 等等等等
出版社代码越小,越有好处——这个我等下再说——而且也基本代表了出版社的地位。我们平时说的“大社”,一般来说,代码都是很小的。
07036:出版物流水号。这个没有什么特别的意义。2:校验码。可以是0-1以及X。算法稍后讨论。
ISBN的长度是固定的,13位中,前三位只有两种变化,而且是规定好了的;最后一位不能变,所以有效的“长度”只有9位,用9位数字来表示一本书,就意味着最多只有10亿本“不同”的书。(算上前三位只有两种可能性,所以是20亿本)。
现在,大家可以体会到一个短的大分组代码和一个短的出版社代码有多大的影响了吧?
假定你是中国的出版社,获得了7的大分组代码,去掉前3位和最后1位校验码,你还有8位数字可以真正用来标记一本书。如果你的出版社代码是2位,你还有6位数字,也就是你可以出100万本书;如果你的出版社代码是4位,你只剩下4位数字,那你最多可以出1万本书而已!
那么,校验码如何计算呢?这里有两种情况。
对于10位的ISBN,从左到右,第一位乘以10,第二位乘以9,……第九位乘以2,最后一位乘以1(如果是X,当做10)。把这些数字加起来得到一个数字。这个总和必须能够被11整除。
对于13位的ISBN,算法是:
- 对前12位数字,交替乘以1或者3,并求和。
- 求和的数字对10求余数,并用10减去这个余数。
- 这个余数应该等于第13位数字。
(有兴趣的读者可以试着算下自己手上的书。如果你的书有了一个不正确的ISBN,那么一定是盗版的。我自己编写了一个小程序,用到了AI的提示,校验10位ISBN。这篇文章讲到的冷知识,也是因为我要完成一个编程作业而顺手研究了一下。)

本文用到的参考资料:

Leave a Reply