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…
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.
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.
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
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 :
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.
Merci beaucoup pour votre rĂ©ponse et votre aide, j’ai donc adaptĂ© votre script et cela fonctionne bien :
function ean2isbn($x)
{
}
Bonne continuation đ