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

Il y a quelques temps, je proposais ici-même une fonction php pour convertir ISBN-10 en EAN-13 (en recalculant la clé de contrôle) mais aussi une tentative de méthode pour convertir un EAN-13 en ISBN. Seul petit souci, aujourd’hui les ISBN sont à 13 chiffres, comme les EAN, la seule différence entre les deux formats étant les tirets qui les sépare, mais je n’avais aucune idée de la marche à suivre pour retrouver la place de ces fameux tirets dans le code. J’ai longtemps cherché comment faire, ayant besoin de convertir des EAN-13 en ISBN-13 dans le cadre de mon moteur Tys, qui propulse notamment la Librairie Ys, la Librairie Soleil Vert et le site des Editions du Bélial. Et bien, grâce au coup de pouce d’un gentil commentateur, c’est maintenant chose faite. Petite recontextualisation : aujourd’hui, on attribue à chaque livre un code ISBN (par exemple 978-2-07-035570-9 pour Janua Vera) qui permet de le retrouver facilement dans une base (utile par exemple aux libraires pour commander un livre auprès d’un fournisseur). A ce code ISBN, correspond un code EAN, qui est tout simplement un code ISBN sans tiret (9782070355709 pour le même exemple) et qui est celui que l’on trouve sous le code barre au dos du livre. L’avantage de ce code EAN est qu’il est lisible par un lecteur de code barre et qu’il est plus facile à traiter informatiquement, l’avantage de l’ISBN est qu’il est plus facilement lisible par un être humain. De plus, cette séparation en tirets a un sens bien précis. Un ISBN-13 (à 13 chiffres, en vigueur depuis 2007) se décompose en 5 modules : A-B-C-D-E.

  • A (978) est toujours égal à 978 ou 979, ça signifie qu’on est en présence d’un livre.
  • B (2) correspond à la langue dans lequel le livre est écrit : 2 pour le français, 0 ou 1 pour l’anglais, etc.
  • C (07) est un code qui correspond à l’éditeur (en l’occurence 07 pour Gallimard, tous les ISBN de livres édités par Gallimard commenceront donc par 978-2-07). Il peut-être long de 2 à 7 chiffres.
  • D (035570) est le numéro d’ordre d’ouvrage. En simplifiant grossièrement, on peut dire que Janua Vera est le 35570ème livre à être édité par les éditions Gallimard (depuis la mise en place des codes ISBN depuis les années 70). Il peut-être long de 1 à 6 chiffres.
  • E (9) est une clé de contrôle à un chiffre qui permet de vérifier la validité du code ISBN.

Autant il est facile de replacer les tirets qui séparent A de B, B de C, et D de E, autant retrouver l’emplacement du tiret qui sépare C de D paraît impossible, dans la mesure où les codes éditeurs et les numéros d’ordre d’ouvrage ont une longueur variable, longueur qu’il est impossible de connaître quand on dispose uniquement de l’EAN brut. Impossible ? Non ! Car jfrey, qu’il en soit ici remercié, a attiré mon attention sur cette page. On y découvre notamment que, en fonction du code langue (B), les codes éditeurs (C) ne peuvent correspondre qu’à une certaine plage de valeur (de 01 à 19, de 200 à 349, de 400 à 699, etc.). Cette information permet de retrouver facilement, en fonction de la du premier chiffre du code éditeur, quelle est la longueur de de code (en gros). D’où la fonction suivante, qui permet donc de convertir des EAN-13 (sans tiret) en ISBN-13 (avec tirets) :

function ean2isbn($x) {   $x = str_replace(" ","",str_replace("-","",$x));   if(strlen($x) == 13) {     $a = substr($x,0,3);     $b = substr($x,3,1);     $cd = substr($x,4,8);     $k1 = substr($x,4,1);     $k3 = substr($x,4,3);     $k4 = substr($x,4,4);     $k5 = substr($x,4,5);     $k6 = substr($x,4,6);     $k7 = substr($x,4,7);     $e = substr($x,12,1);     if($a == "978" and $b == "2") {       if($k1 == "0" or $k1 == "1") $l = "2";       elseif($k3 >= "200" and $k3 <= "349") $l = "3";       elseif($k5 >= "35000" and $k5 <= "39999") $l = "5";       elseif($k3 >= "400" and $k3 <= "699") $l = "3";       elseif($k4 >= "7000" and $k4 <= "8399") $l = "4";       elseif($k5 >= "84000" and $k5 <= "89999") $l = "5";       elseif($k6 >= "900000" and $k6 <= "949999") $l = "6";       elseif($k7 >= "9500000" and $k7 <= "9999999") $l = "7";       $c = substr($cd,0,$l);       $d = substr($cd,$l,8-$l);       return $a."-".$b."-".$c."-".$d."-".$e;     }   } }

Utilisation :

$ISBN = ean2isbn(9782070355709); // retourne 978-2-07-035570-9

Notez que cette fonction ne fonctionnera qu’avec les codes ISBN de livres francophones (donc commençant par 9782), mais qu’elle peut être facilement adapté à d’autres langues en y implémentant les pages de valeurs indiquées à cette adresse. J’ai utilisé cette fonction pour convertir les six mille et quelques fiches livres de la base Tys qui avaient un EAN mais pas d’ISBN, et je n’ai a priori pas réussi à prendre cette portion de code en défaut. Si c’est votre cas, n’hésitez pas à me le signaler ! Vous pouvez essayer cette fonction ici : http://ext.nokto.net/convert.php

Laisser un commentaire