サンプル・プログラムの実行例

サンプル・プログラム
isbn2asin.php | サンプル・プログラム本体。 |
ISBNコード
2006年(平成18年)12月31日までは10進数10桁の番号が用いられていたが、2007年(平成19年)以降には10進数13桁の番号へ移行した。ここでは現行規格を中心に説明する。

ISBNコードは10進数13桁からなり、その内容は下記の通りである。
桁 | 内容 |
---|---|
13-11 | 識別番号(978または979) |
10 | グループ記号(出版国などを表す数字で、日本は4) |
9-6 | 出版者記号 |
5-2 | 書名記号 |
1 | チェックデジット |
内容 | 値 |
---|---|
識別番号 | 978 |
グループ記号 | 4 |
出版者記号 | 8443 |
書名記号 | 2788 |
チェックデジット | 2 |

チェックデジットはモジュラス10 ウェイト3 という方式である。以下のように計算する。
- チェックデジットをのぞく一番左側の桁から順に1,3,1,3を掛けて、それらの和を取る。
- 和を10で割った余りを10から引く。ただし10で割って出た余りの下1桁が0の場合は0とする。
9×1+7×3+8×1+4×3+8×1+4×3+4×1+3×3+2×1+7×3+8×1+8×3=138
138%10=8
10-8=2
となり、チェックデジットの 2 を得ることができる。

ちなみに、旧規格(2007年12月31日まで)は10進数10桁であるが、グループ記号、出版者記号、書名記号は現行規格と同じである。チェックデジットの計算方法は異なる(モジュラス11 ウェイト10-2)。
ASINコード

ISBNの現行規格についても、識別番号が978であるものについては、桁数10-2は同一である。ただしチェックデジットの計算方法がモジュラス11 ウェイト10-2であるため、最後の1桁の数字が異なる。

モジュラス11 ウェイト10-2方式は、以下のように計算する。
- チェックデジットを除いた左側の桁から10,9,8‥‥2を掛けてそれらの和を取る。
- 和を11で割って出た余りを11から引く。
4×10+8×9+4×8+4×7+3×6+2×5+7×4+8×3+8×2=268
268%11=4
11-4=7
となり、チェックデジットの 7 を得ることができる。
ISBNとASINの関係
解説:ISBNコードをASINコードに変換する
0151: /**
0152: * ISBNコードをASINコードに変換する
0153: * @param string $isbn ISBNコード(10進数10桁or 13桁)
0154: * @return string ASINコード(10進数10桁)/FALSE:変換に失敗
0155: */
0156: function isbn2asin($isbn) {
0157: //旧ISBNコードの場合はそのまま返す
0158: if (preg_match('/^[0-9]{9}[0-9X]$/', $isbn) == 1) {
0159: if (cd11($isbn) != substr($isbn, 9, 1)) return FALSE;
0160: return $isbn;
0161: }
0162:
0163: //入力値チェック
0164: if (preg_match('/^[0-9]{13}$/', $isbn) != 1) return FALSE;
0165: if (cd10($isbn) != substr($isbn, 12, 1)) return FALSE;
0166: if (preg_match('/^978/', $isbn) == 0) return FALSE;
0167:
0168: $code = substr($isbn, 3, 10); //10-1桁目を取り出す
0169: $cd = cd11($code);
0170:
0171: return substr($isbn, 3, 9) . $cd;
0172: }
0118: /**
0119: * チェックデジットの計算(モジュラス11ウェイト10-2)ASIN用
0120: * @param string $code 計算するコード(最下位桁がチェックデジット)
0121: * @return intチェックデジット
0122: */
0123: function cd11($code) {
0124: $cd = 0;
0125: for ($pos = 10; $pos >= 2; $pos--) {
0126: $n = substr($code, (10 - $pos), 1);
0127: $cd += $n * $pos;
0128: }
0129: $cd = $cd % 11;
0130: $cd = 11 - $cd;
0131: if ($cd == 10) $cd = 'X';
0132: if ($cd == 11) $cd = '0';
0133: return $cd;
0134: }
0136: /**
0137: * チェックデジットの計算(モジュラス10ウェイト3)
0138: * @param string $code 計算するコード(最下位桁がチェックデジット)
0139: * @return intチェックデジット
0140: */
0141: function cd10($code) {
0142: $cd = 0;
0143: for ($pos = 13; $pos >= 2; $pos--) {
0144: $n = substr($code, (13 - $pos), 1);
0145: $cd += $n * (($pos % 2) == 0 ? 3 : 1);
0146: }
0147: $cd = $cd % 10;
0148: return ($cd == 0) ? 0 : 10 - $cd;
0149: }
ただ、入力値のチェックは細かく行っている。

入力値が10進数10桁なら旧ISBNとして処理をする。この際、チェックデジットが合っているかどうか検査する。※10桁の末尾が 'X' の時に正常に動作しませんでした。クロメルさん、ご指摘及び改良方法の提案をありがとうございました(2015年9月20日)。

入力値が10進数13桁なら現行ISBNとして処理をする。この際、チェックデジットがあっているかどうか検査する。また、上位3桁が978以外の場合は変換処理ができないようにしてある。

チェックデジットの計算には、ユーザー関数cd10, cd11を用意した。

また、このプログラムはコマンドラインから単独で利用できるようにしてある。
isbn2asin.php?isbn=9784844327882
として実行すると、標準出力にASINコードのみが出力される。エラー発生時には 'ERROR' と出力する。
参考サイト
- 日本図書コード管理センター
- PHPでISBNコードからNDCコードを求める:ぱふぅ家のホームページ
- PHPで国立国会図書館を検索:ぱふぅ家のホームページ
- PHPで Windows用国立国会図書館検索プログラムをつくる:ぱふぅ家のホームページ
- PHPで楽天ブックスAPIを使って書籍検索:ぱふぅ家のホームページ
今回は、国際標準図書番号「ISBN」から、ASINへコード変換するプログラムを作ってみる。