图书出版编码 ISBN 介绍

@ 2009-06-03 22:54:02
标签:

    ISBN 的全程是 International Standard Book Number。ISBN 是用来标识一本书的一串数字。
    2007-01-01之后的书籍的 ISBN 的长度为13位,在此之前的 ISBN 长度为10位。
    ISBN代码中主要包含了书籍的语言种类、出版社和书名。

    以一个中国的ISBN号码为例: 978-7-309-04454-6

    • 978 是GS1前缀。978表示是图书产品。有时也会看到 979。(前缀代码参考)
    • 7 表示中文图书。如果是0或者1,则表示是英文图书。
    • 309 是出版社的代号。这里是复旦大学出版社
    • 04454 是书名的编号
    • 6 是校验码

    10位ISBN和13位ISBN代码的转换

    主要是校验位的计算问题。例如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和条形码的转换

    在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 条形码。更多关于条形码的内容可以参考后面提供的链接。

    资源

    标签:

      分享到:
      comments powered by Disqus

      28/30ms