ISBN 的全程是 International Standard Book Number。ISBN 是用来标识一本书的一串数字。
2007-01-01之后的书籍的 ISBN 的长度为13位,在此之前的 ISBN 长度为10位。
ISBN代码中主要包含了书籍的语言种类、出版社和书名。
以一个中国的ISBN号码为例: 978-7-309-04454-6
主要是校验位的计算问题。例如10位的ISBN号码 7-309-03699-9,最后一位数字 9 是校验位,其计算方法是:
set isbn_10 {7 3 0 9 0 3 6 9 9} set sum 0 for {set i 0} { $i<9 } {incr i} { incr sum [expr [lindex $isbn_10 $i]*(10-$i)] } set check_digit [expr 11 - $sum%11] # 7*10 + 3*9 + 0*8 +9*7 + 0*6 + 3*5 + 6*4 + 9*3 + 9*2 = 244 # 11 - 244%11 = 11 - 2 = 9 # 如果结果是10,用罗马数字的X表示
在9位ISBN前加上978变成13位ISBN,当然校验位需要重新计算。校验位的计算方法如下:
set isbn_13 {9 7 8 7 3 0 9 0 3 6 9 9} set sum 0 for {set i 0} { $i<12 } {incr i} { incr sum [expr [lindex $isbn_13 $i]*($i%2==0?1:3)] } set check_digit [expr 10 - $sum%10] # 9*1 + 7*3 + 8*1 + 7*3 + 3*1 + 0*3 +9*1 + 0*3 + 3*1 + 6*3 + 9*1 + 9*3 = 128 # 10 - 128%10 = 2 # 结果如果为10,就用 0 代替。(计算结果不可能为 0 的)
所以上例中对应的13位ISBN为 978-7-309-03669-2。
在10位ISBN前加上前缀 978,重新计算校验位如下
set barcode {9 7 8 7 3 0 9 0 3 6 9 9} set sum 0 for {set i 0} { $i<12 } {incr i} { incr sum [expr [lindex $barcode $i]*( (11-$i)%2==0?3:1)] } set check_digit [expr 10 - $sum%10] # 9*1 + 7*3 + 8*1 + 7*3 + 3*1 + 0*3 +9*1 + 0*3 + 3*1 + 6*3 + 6*1 + 9*3 = 128 # 10 - 128%10 = 2 # 结果如果为10,就用 0 代替。(计算结果不可能为 0 的)
上面例子中的条形码为978-7-309-03669-2。 我们可以看出,结果是与13位ISBN相同的。但还是要注意计算方法描述上的不同。
条形码不等同于ISBN,只是恰好 ISBN-13 可以直接用作 EAN-13 条形码。更多关于条形码的内容可以参考后面提供的链接。