Aujourd'hui, les codes ISBN (qui apparaissent au dos des livres) et les codes EAN (code-barre) sont les mêmes, à la différence des petits tirets des codes ISBN. Pour passer d'un ISBN-13 à un EAN-13, il suffit donc de retirer les tirets en question. Mais pour les livres parus avant janvier 2007, les codes ISBN ne comportaient que 10 chiffres (ISBN-10) dont une clé de contrôle (dernièr caractère) différente de la clé des EAN. Dans les métiers du livre, on a parfois besoin de convertir un ISBN-10 en EAN-13, et il ne suffit malheureusement de virer trois chiffres pour passer de l'un à l'autre : il faut recalculer la clé de contrôle. C'est ce que fait la fonction ci-dessous :

function isbn2ean($x)
{
$x = str_replace("-","",$x);
$x = str_replace(" ","",$x);
if(strlen($x) < 10) $x = $x."X";
if(strlen($x) == 10) // ISBN10
{
$x = substr($x,0,-1);
$x = "978".$x;
$code = $x;
$x = str_split($x);
$i = 0;
while($i2 <= 11)
{
if($i2%2 == 0) $p = "1";
else $p = "3";
$r += $x[$i] * $p;
if($x[$i] != "-") $i2++;
$i++;
}
$q = floor($r/10);
$x = 10 - ($r - $q * 10);
if($x == "10") $x = "0";
$x = $code.$x;
}
return $x;
}

Utilisation :

$ean = isbn2ean("2-913039-18-9"); // retourne 9782913039148

J'ai aussi une fonction qui permet de faire l'inverse, à savoir convertir un EAN en ISBN. Mais cette conversion pose deux problème : d'abord, pas moyen de savoir si l'ISBN correspondant à notre EAN est un code à 10 ou à 13 chiffres sans connaître la date de parution de l'ouvrage (et même, il y a eu quelques cafouillages début 2007). L'autre souci est que le code ISBN se décompose en 4 fragments : A-B-C-D où A est un code correspondant à la langue (2 pour les pays francophones), D est la clé de contrôle, B un code correspondant à l'éditeur et C le numéro du livre chez l'éditeur. Si A et D sont toujours longs d'un caractère, impossible de savoir (à ma connaissance) où se trouve le tiret qui sépare B et C à partir de l'EAN. Cette fonction renvoie donc un ISBN-10 sans tiret.

function ean2isbn($x)
{
$x = str_replace("-","",$x);
$x = str_replace(" ","",$x);
if(strlen($x) == 13)
{
$x = substr($x,-10,9);
$k = str_split($x);
$m = 10;
foreach($k as $K)
{
$K = $K*$m;
$t += $K;
$m--;
}
$k = 11 - ($t % 11);
if(strlen($k) > 1) $k = "X";
$x = $x.$k;
}
return $x;
}

Utilisation

$isbn = ean2isbn("9782913039148"); // retourne 2913039146
Vous pouvez essayer ces deux fonctions ici : http://ext.nokto.net/convert.php

J'étais tombé une fois sur un site (impossible de le retrouver, évidemment) qui proposait un formulaire convertissant un EAN-13 en ISBN avec tirets, mais sans code source. Perso, je ne vois pas comment faire ça sans avoir à disposition une base de données croisant ISBN et EAN. Mais si quelqu'un a une idée, je suis preneur...