日記/2020-12-16
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へのリンクをすっきりしたものに修正しておいた。