日記/2020-12-16

最終更新時間:2020年12月16日 17時26分19秒

ISBNの13桁から10桁への変換

 

 RakutenBooksSearch プラグインを書いたとき困ったのは、楽天ブックス総合検索APIで得られる情報の中に、10桁のISBNがなく、13桁のものしかないこと。Amazonでは、10桁のISBNが書籍の商品管理のための番号として使われており、例えばこれが「4150314624」である「信長島の惨劇」の商品ページへのリンクは、

と書けるのだが、13桁の方がわかってもリンクは作れない。
 しかたないので、13桁のISBNを使ってAmazonで検索した結果のページへのリンクでお茶を濁しておいたのだが、今さらながらちょっと調べてみたら、Wikipediaの「ISBN」のページに、13桁から10桁への変換方法(というかチェックディジットの計算方法)が書いてあった。
 そもそもWikipediaには、

2007年以降の新刊書には当初から13桁の新規格ISBNが付けられており、10桁ISBNは新たに発番しない。

とあるのだが、Amazonでは今も10桁のものが商品管理に使われているのは上述の通り(Amazonの書籍の商品ページには、2007年以降の出版物であっても、13桁のものと10桁のものの両方が記載されている)。
 で、13桁から10桁への変換は、

  • 頭の3桁(接頭記号)を取り去り
  • 末尾の1桁(チェックディジット)も取り去って
  • 残った9桁からチェックディジットを計算し直して
  • それを末尾にくっつけて10桁にする

というもの。
 10桁のISBNのチェックディジットの計算方法は以下の通り。Wikipediaからそのまま引用する。

旧規格のISBN (ISBN-10) のチェックディジットは、「モジュラス11 ウェイト10-2」という計算法にて算出される。(チェックディジットを除いた左側の桁から10、9、8…2を掛けてそれらの和を取る。和を11で割って出た余りを11から引く)

ここで、例として ISBN4-10-109205-□ のチェックディジット(□部分)を求めてみる。

4×10 + 1×9 + 0×8 + 1×7 + 0×6 + 9×5 + 2×4 + 0×3 + 5×2
= 40  +  9  +  0  +  7  +  0  +  45 +  8  +  0  +  10
= 119
119 ÷ 11 = 10 あまり 9
11 - 9 = 2

よって、このISBNのチェックディジットは2である。なお、計算結果が10になった場合、10の代わりにX(アルファベットの大文字)を用いる。また、11になった場合は、0となる。

 これをPerlで書いてみた。Qiitaなんかを見ると、一行で書いてみた的なかっこいいコードがザクザク見つかるのだが、以下はアホみたいに愚直なもの。

#! /usr/bin/perl
use strict;
use warnings;

my $isbn13 = "9784334790721";

my $cd = 0;
for my $i (3..11) {
    my $c = substr($isbn13, $i, 1);
    $cd += $c * (10 - ($i - 3));
}

$cd = $cd % 11;
$cd = 11 - $cd;
if ($cd == 10) {
    $cd = "X";
} elsif ($cd == 11) {
    $cd = 0;
}
my $isbn10 = substr($isbn13, 3, 9).$cd;

print "$isbn10\n";

 これをRakutenBooksSearch プラグインにも組み込んで、Amazonへのリンクをすっきりしたものに修正しておいた。