ISBN10/13 相互変換用コード

使う人がいるかわからんが、図書系のWeb APIを使う場合、必須なので誰かいるかもしれん。ということで置いておく。

いまのところ、ASIN(Amazon管理コード)はISBN10と同義なのでISBN13からASINへの変換はこれで足りるけど、一応Amazon側は将来的な仕様変更の可能性も残しているので、変更になったらここにASIN変換用コードをたさんといかんな。

<?php

function ISBN_9to10($isbn){
  
  // 総和を求める
  for ($digit=0, $i=0; $i<9; $i++){
    $digit += $isbn{$i} * (10 - $i);
  }
  
  // 11から総和を11で割った余りを引く(10の場合はX, 11の場合は0に)
  $digit = (11 - ($digit % 11)) % 11;
  if ($digit == 10){
    $digit = "X";
  }
  
  return $isbn.$digit;
  
}

// 9桁ISBNを13桁新ISBNにする
function ISBN_9to13($isbn){
  
  $isbn = "978" . $isbn;
  
  // 総和を求める
  for ($digit=0, $i=0; $i<12; $i++){
    $digit += $isbn{$i} * ($i % 2 == 0 ? 1 : 3);
  }
  
  // 10から総和を10で割った余りを引く(10の場合は0に)
  $digit = (10 - ($digit % 10)) % 10;
  
  return  $isbn.$digit;
  
}

// 10桁旧ISBNを13桁新ISBNにする
function ISBN_10to13($isbn){
  
  $isbn = substr($isbn, 0, 9); // チェックデジット除去
  return ISBN_9to13($isbn);
  
}

// 13桁新ISBNを10桁旧ISBNにする
function ISBN_13to10($isbn){
  
  $isbn = substr($isbn, 3, 9); // 978+チェックデジット除去
  return ISBN_9to10($isbn);
  
}

// 12桁新ISBNにチェックデジットを足す
function ISBN_12to13($isbn){
  
  $isbn = substr($isbn, 3, 9); // 978接頭辞除去
  return ISBN_9to13($isbn);
  
}

// 12桁新ISBNを10桁旧ISBNにする
function ISBN_12to10($isbn){
  
  $isbn = substr($isbn, 3, 9); // 978接頭辞除去
  return ISBN_9to10($isbn);
  
}

?>