PHP : Convertir un ISBN-10 en EAN-13 (et vice-versa)

Quand on est dĂ©veloppeur web et libraire (et un peu nerd sur les bords), on peut se retrouver Ă  faire ce genre de choses : convertir des codes ISBN en code EAN et rĂ©ciproquement via PHP. Comme je n’ai rien trouvĂ© d’Ă©quivalent ailleurs, j’ai du crĂ©er ma propre petite fonction. Et comme j’ai pensĂ© qu’elle pouvait Ă  d’autres, je vous en livre le code ci-dessous. Ainsi que quelques interrogations.

(Voir aussi PHP : Convertir un code EAN-13 (sans tirets) en ISBN-13 (avec tirets))

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…

5 rĂ©ponses sur “PHP : Convertir un ISBN-10 en EAN-13 (et vice-versa)”

  1. Wow, merci ! Ca a bien l’air d’ĂȘtre exactement ce que je cherche. En fait j’Ă©tais tombĂ© sur quelque chose comme ça mais je n’avais pas compris que c’Ă©tait la solution que je cherchais. Par contre, si ça peut m’aider Ă  calculer le bloc Ă©diteur, reste le problĂšme de savoir si l’ISBN Ă©tait Ă  10 ou 13 chiffres… enfin c’est dĂ©jĂ  ça ! Je reviens vers vous avec une nouvelle fonction dĂšs que j’ai le temps de regarder ça en dĂ©tail.

  2. Content d’avoir Ă©tĂ© utile. Ce n’est que justice aprĂšs avoir eu l’occasion de dĂ©goter plein de beaux livres sur Librys.

    Je n’ai rien trouvĂ© non plus pour diffĂ©rencier ISBN 10 et 13 mais est-ce bien utile ? Tant que l’EAN commence par 978 les deux sont Ă©quivalents non ? Sur amazon on peut rechercher indiffĂ©remment avec l’un ou l’autre, que les livres datent d’avant ou d’aprĂšs 2007. Autant rendre hommage Ă  de vieux livres de SF en les convertissant en ISBN 13 dans une BDD.

  3. Bonjour, merci pour ce script que je comptais utiliser mais je n’obtiens pas l’ISBN 10 souhaitĂ© Ă  partir d’un EAN 13.
    J’ai utilisĂ© un convertisseur en ligne : http://www.isbn.org/converterpub.as… qui lui me donne le bon ISBN 10 (sans prendre en compte les tirets)

    Ex Ă  partir de l’EAN 13 suivant : 978-2812600333
    votre script => 281260033X
    autre script (cf lien donné) => 2-8126-0033-0
    ce que je souhaitais => 2812600330

    Auriez vous des idĂ©es sur cette diffĂ©rence ? Merci d’avance

  4. Bonjour,
    Pour le script, vous parlez du code source de Tellico ? Quand on entre un ISBN dans ce logiciel, il s’occupe tout seul de calculer le dernier chiffre. Et avec 281260033 il trouve bien 0.

    J’ai regardĂ© le code, pour passer d’un ISBN 13 Ă  un ISBN 10 le programme enlĂšve les tirets, enlĂšve 978 et recalcule le dernier chiffre avec l’algo prĂ©sent dans la fonction checkSum10 du fichier http://websvn.kde.org/trunk/extrage
    Il met pour finir le résultat en forme.

    Avez-vous bien implémenté la fonction en php ? Celle de Tellico est tirée de celle-ci, en javascript et plus lisible à mon sens :

    if (indexisbn.indexOf("978") == 0) {     isbn = isbn.substr(3,9);     var xsum = 0;     var add = 0;     var i = 0;     for (i = 0; i < 9; i++) {         add = isbn.substr(i,1);         xsum += (10 - i) * add;    }    xsum %= 11;    xsum = 11 - xsum;    if (xsum == 10) { xsum = "X"; }    if (xsum == 11) { xsum = "0"; }    isbn += xsum; }

    Cf la page suivante : http://www.eblong.com/zarf/bookscan

    Je l’ai testĂ©e avec votre ISBN (ok j’ai trichĂ©, j’ai juste fait tournĂ© la boucle sur 281260033), lĂ  encore « 0 » est trouvĂ©. Si le mauvais comportement persiste, je peux jeter un Ɠil neuf Ă  votre code si vous le souhaitez.

  5. Merci beaucoup pour votre rĂ©ponse et votre aide, j’ai donc adaptĂ© votre script et cela fonctionne bien :

    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 ($k == 10) { $k = "X"; }    if ($k == 11) { $k = "0"; }    $x = $x.$k;  }  return $x;

    }

    Bonne continuation 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *