見出し画像

ISBNコードの10桁13桁やハイフン有り無しの話

■2021年1月4日追記
 この記事で出版社記号の桁数のルールを説明していますが、2019年1月からJPOにより提供されている「シングルコード」で例外処理が必要かどうかについて、現在、日本図書コード管理センターに問い合わせ中です。詳細が判明次第、こちらの記事に反映いたします。
 ※1月5日さらに追記:シングルコードの「出版社記号」についてもハイフンの場所について例外は無いとのことでした。

 皆さん、ISBNをご存じですか? 書籍の表4(裏表紙)に、バーコードなどと一緒に印刷されているアレです。書店や出版社のWebサイトやオンライン書店などでもよく見かけると思います。既に気がついている方も多いと思いますが、アレ、10桁だったり13桁だったりハイフンが付いていたりいなかったりしますよね。そういえばnoteで、以前、こんな話を書いていました。ご笑覧ください。
正式名称の長い長い商品名と救急車

 今回は、Webサイトなどでよく見かけるISBN10桁13桁・ハイフン有り無しの件について書きます。最初に書いておきますが、現行のISBNの正解は「13桁ハイフン有り」です。特に罰則などがあるわけではありませんが、Webサイトや印刷物でISBNを表示するなら「13桁ハイフン有り」が望ましいです(内部での運用については特に問題ないです)。

 では、始めます。

 ISBNは商業出版物として流通する書籍で使われている商品別の識別コードです。国際標準になっており、日本だけでなく世界中で使われています。ISBNの詳細な仕様についてはISBNの本部に詳しい資料が掲載されていますので、そちらをご参照ください(英語です)。
https://www.isbn-international.org/

 書籍や出版物の定義の話はここでは触れません。ざっくり、リアル書店やオンライン書店で普通に売られている本をタイトルごとに識別するためのコードと言っておきます(このあたり、細かく突っ込みだすとけっこう大変なので今回は勘弁してください)。

 国際標準と言ってもローカルルールはあります。日本の場合は、ISBNの他に分類を表すCコードや本体価格の表示、さらにそれらを全て表す二段バーコードの仕様なども合わせて「日本図書コード」として体系化されています。日本図書コードの詳細についてもここでは触れません。詳しく知りたい方は日本図書コード管理センターのWebサイトからダウンロードできる『ISBNコード日本図書コード書籍JANコードご利用手引き』をご参照ください。
https://isbn.jpo.or.jp/

 ISBNは80年代から日本での導入が始まりました。当初は、出版文化が管理され多様性が損なわれるといった視点からの反対も多かったようです。しかし、主に流通や商品管理における利便性などから普及が進みました。2000年代に入ってからの話になりますが、amazonが日本に上陸後「ISBNの付いている書籍を商品として扱う」という立場を明確にしたことも、さらなる普及と利用に大きな影響を与えたかも知れません。その後、仕様の変更があり、2007年1月から、ISBNは、それまでの10桁ハイフン有りから13桁ハイフン有りへと移行しました。それ以降、仕様の変更はありません。

 ISBNが流通している書籍に付いている国際標準に則ったコードで、現行の正解は13桁ハイフン有りだというのはOKでしょうか。

 では、続けます。

 ここで少しだけ、ISBNの構造と意味を説明します。現行のISBN(13桁ハイフン有り)は、以下の5つの部分に分かれた構造となっています。
(接頭記号978または979)-(国番号、日本は4)-(出版社記号2桁から7桁)-(書名記号1桁から6桁)-(チェックデジット1桁)
 最初の978(979は日本ではまだ使われていません)が、13桁化の際に増えた3文字です。それまでは国番号の4から始まる10桁ハイフン有りでした。なので、「頭に978-足せばいいんだな」と考えて単純に978-を付け足した出版社もありました。が、これは不正解です。末尾にあるチェックデジットですが、10桁と13桁では算出するための計算方式が違うため、異なる数字になる場合があります(もちろん同じ数字になることもありますが)。ですので、頭に978-を付け足しただけでは間違いです。

 話を戻します。

 2007年に13桁化されたISBNですが、それ以前から運用のルールは緩めでした。そのため、利用する側(ここでは書店や取次)によるハイフン無しでの運用は普通に行われていました。実際には、先頭の識別番号978と国番号の4は固定のうえに末尾のチェックデジットは計算で算出できるので、一意の識別子としては8桁で用が足ります。これは10桁の場合も13桁の場合も同様です。なお、10桁のチェックデジットは「X」となる場合があったため、8桁をハイフン無しで運用すると数値だけで管理できるというメリットもあったかと思います。13桁化に際してチェックデジットの計算方法が変わり、「X」というチェックデジットはなくなりました。

 データベースで使用するための一意の識別子としては、将来的に接頭記号979が使われると困りますが、それまではハイフン無しの8桁の数値で充分だということはOKでしょうか。データベースで扱うなら文字列より数値のほうが扱いやすいですし、桁数も少ないほうが便利です。

 ということで、10桁のISBNが使われていた2006年までは、チェックデジットとハイフンを除いた9桁の数値か、さらに国番号も除いた8桁の数値をID(識別子)として利用している場合があったと聞いております。その名残で、今でも運用上は9桁もしくは8桁のままのところもありそうです。

 このあたりが、ISBNの10桁13桁ハイフン有り無しが混在している原因のようです。

 ここから、ISBN10桁13桁ハイフン有り無しの変換について簡単に触れます。

 ISBNからハイフンを除くのは簡単です。何らかのプログラムや関数でハイフンを取り除くか、もしくは正規表現などを使って数値だけを残すか。どちらにせよ、一発で済む簡単な話です。

 ハイフン無しからハイフン有りへの変換はどうしたら良いでしょうか。ハイフンを入れる場所を決める必要があります。考えなければいけない箇所は一か所だけです。978-4-出版社記号-書名記号-CD(チェックデジット)なので、出版社記号と書名記号の間に入れるハイフンの位置が分かれば問題は解決です。

 実は、出版社記号の桁数は出版社記号の数値によって決まっています。以下のリンク先に日本図書コード管理センターの手引きから作成した表を置いてあります。
https://honno.info/category/reference/isbn_registrant.html
 表の内容から出版社記号の値と桁数の部分だけを以下に抜粋しました。
  2桁 00-19
  3桁 200-699
  4桁 7000-8499
  5桁 85000-89999
  6桁 900000-949999
  7桁 9500000-9999999
 13桁ハイフン無しのISBNから出版社記号の先頭2桁に該当する5桁目6桁目の数値を抽出して場合分けすると、出版社記号の桁数(長さ)を決定できます。

 まとめというわけではありませんが、以下に、10桁13桁ハイフン有り無しのISBNから13桁ハイフン有りのISBNを作成するPHPの関数を置いておきます。

/** 10桁13桁ハイフン有り無しISBNから13桁ハイフン有りISBNを作るPHP関数 */

function isbn_hyphenate($str){ // 引数$strは10桁13桁ハイフン有り無しISBN
	$a = $str;
	$a = mb_convert_kana($a, "n", "utf-8"); // 全角文字などを半角文字に変換
	$a = preg_replace('/\D/', '', $a); // 正規表現を使って数値だけを抽出
	if(strlen($a)==9 || strlen($a)==10){ // 抜き出した数値が9桁(10桁ISBNのチェックデジットがXだった場合)か10桁の場合
		$cd = substr(10-substr(9+8+$a[1]+$a[3]+$a[5]+$a[7]+(7+4+$a[2]+$a[4]+$a[6]+$a[8])*3,-1),-1); // 13桁ISBNのチェックデジットを算出
		$a = "978" .substr($a, 0, 9) .$cd; // 接頭記号978と10桁ISBNの1桁目から9桁目まで13桁ISBNのチェックデジットを連結して13桁ハイフン無しISBNを作成
	}
	if(strlen($a)==13){ // 引数が13桁ISBNだった場合と、前の行までで作成した13桁ISBNの両方に適用される条件分岐
		if(substr($a,4,2)<20){ // 以下、出版社記号の桁数に応じた場合分け
			$a = "978-4-" .substr($a,4,2) ."-" .substr($a,6,6) ."-" .substr($a,12,1);
		}elseif(substr($a,4,2)<70){
			$a = "978-4-" .substr($a,4,3) ."-" .substr($a,7,5) ."-" .substr($a,12,1);
		}elseif(substr($a,4,2)<85){
			$a = "978-4-" .substr($a,4,4) ."-" .substr($a,8,4) ."-" .substr($a,12,1);
		}elseif(substr($a,4,2)<90){
			$a = "978-4-" .substr($a,4,5) ."-" .substr($a,9,3) ."-" .substr($a,12,1);
		}elseif(substr($a,4,2)<95){
			$a = "978-4-" .substr($a,4,6) ."-" .substr($a,10,2) ."-" .substr($a,12,1);
		}else{
			$a = "978-4-" .substr($a,4,7) ."-" .substr($a,11,1) ."-" .substr($a,12,1);
		}
	}else{
		$a = -1; // 引数がISBNではなかった場合に返す値を設定(任意の値)
	}
	return $a;
}

 続いて、ISBN13桁ハイフン有りからISBN10桁ハイフン無しを返す関数です。ポイントはISBN10桁のチェックデジットの計算(モジュラス11ウェイト10-2)ですが、式を変形すると、以下のように簡単になります(ずいぶん昔に変形したので手順を忘れてしまいましたが、正しく計算されています)。

/** 13桁ハイフン有り無しISBNから10桁ハイフン無しISBNを作るPHP関数 */

function isbn10($str) { // 引数$strは13桁ハイフン有り無しISBN
	$a = str_replace("-", "", $str); // ハイフンを取り除く
	$b = substr($a,3,9); // 9784に続く9桁を抽出
	$c = ($b[0]+$b[1]*2+$b[2]*3+$b[3]*4+$b[4]*5+$b[5]*6+$b[6]*7+$b[7]*8+$b[8]*9)%11; // 10桁ISBNのチェックデジットを計算
	if($c == 10){ // 求めたチェックデジットが10の時、Xに置き換える
		$c = 'X';
	}
	$d = $b .$c;
	return $d;
}

 蛇足ですが、ISBN10桁ハイフン有りは、ここまでに求めたISBN13桁(の、4-からチェックデジットの前まで)とISBN10桁(のチェックデジット)を組み合わせると作成できます。

 後半およびチェックデジットの計算式などは例の中で触れる程度で簡単に済ませましたが、EXCELの関数でも再現できます。途中の桁の数字を抜き出すにはMID関数を、剰余(余り)を求めるにはMOD関数を使います。ぜひ、お試しください。

 最後に感想を。

 ISBNの仕様などに関しては、発信者側である出版社に対しての啓蒙活動は行われていましたが、考えてみると利用者側(書店・取次・読者)に対する啓蒙はそれほどなされていなかったように思います。そのせいもあってか、アフィリエイトサイトなどではアマゾンでの表記がデファクトになりつつあるように見受けられます。ですが、ISBNはアマゾンのプライベートコードではなく、国際標準として多様な利用者に向けて広く開かれた規格です。内部運用はさておき、Webサイトや印刷物などでの表記に際しては13桁ハイフン有りをご検討いただけると幸いです(自分が言うことではないかもしれませんが)。

2019年10月3日追記

2019年10月8日追記


この記事が気に入ったらサポートをしてみませんか?