Boeken en series dragen identificatoren die op neven lijken en zich gedragen als verwanten met verschillende gewoonten. Beide eindigen op een teken dat uit de tekens ervoor is berekend, dus beide kunnen offline worden gecontroleerd; de boekidentificator is tijdens zijn leven door twee lengtes gegaan, en de serie-identificator heeft een kortere, vaste vorm behouden.
Het interessante deel is niet de rekenkunde, die hetzelfde gewogen-som-patroon volgt als elders, maar de omgang met de invoer. Drukwerk, catalogi en bibliotheeksystemen interpungeren deze nummers op inconsistente manieren, en de letter die op de laatste positie kan voorkomen, breekt elke routine die alleen cijfers aannam.
Hoe worden ISBN- en ISSN-controlecijfers berekend?
Het mechanisme is het bekende. Elk teken in het lichaam krijgt een gewicht dat van zijn positie afhangt, de gewogen waarden worden opgeteld, en de som wordt teruggebracht tot één afsluitend teken. Een code is intern consistent wanneer het afsluitende teken overeenkomt met wat het lichaam oplevert.
Wat verschilt van barcoderekenkunde is het alfabet. Het lichaam van een boeknummer kan helemaal uit cijfers bestaan, maar zijn afsluitende teken is niet beperkt tot de cijfers nul tot en met negen; een van deze identificatorfamilies reserveert een letter voor het geval waarin de gewone rekenkunde een waarde overlaat die een cijfer niet kan uitdrukken. Dat ene teken is genoeg om een implementatie te breken die deze waarden via een geheel getalveld leidt.
Geen van beide families mag alleen aan het einde van een pijplijn worden geverifieerd. Deze identificatoren worden met de hand overgeschreven van de achterkant van een titelpagina, geplakt uit leveranciersspreadsheets en getypt in bibliotheekinterfaces, en elk van die stappen is een plek waar een cijfer kan veranderen zonder dat de vorm verandert.
De waarden waarnaar in dit artikel wordt verwezen worden door hun regels beschreven in plaats van geciteerd. Geen echt boek- of serienummer wordt weergegeven, en een beschreven regel zegt niets over het bestaan van een bepaalde publicatie.
De twee boeknummersystemen en hoe ze verschillen
De boekidentificator is door een generatiewisseling gegaan. De oudere vorm is de kortere; de huidige vorm is langer, en de extra voorste posities maken ruimte voor een veel grotere catalogus nu het uitgeven is gegroeid.
| Eigenschap | Kortere boekvorm | Langere boekvorm |
|---|---|---|
| Lengte van het lichaam | Minder posities | Meer posities |
| Voorste posities | Draagt een kleinere geregistreerde groep | Voorafgegaan door een vaste prefix |
| Controleteken | Eén afsluitend teken | Eén afsluitend teken |
| Relatie | Nog steeds aangetroffen op oudere voorraad | Standaard voor nieuwe publicaties |
Beide vormen blijven in omloop. Een winkel die tweedehands voorraad verkoopt, een bibliotheek met oudere aanwinsten en een importeur die gemengde pallets ontvangt, komen allemaal de kortere vorm tegen, en een routine die alleen de huidige lengte herkent, wijst volkomen goed materiaal af.
De serie-identificator is een aparte familie met zijn eigen kortere, vaste vorm. Het is geen boeknummer met posities verwijderd; zijn rekenkunde en zijn weging horen bij het serieschema, en het ene als een afknotting van het andere behandelen levert controletekens op die nooit overeenkomen.
Wanneer het controleteken de letter X is
De letter verschijnt vanwege de modulus. Deel door een getal groter dan tien en de rest kan op een waarde landen die geen enkel cijfer kan dragen. In plaats van die rest weg te gooien, of hem naar het toegestane bereik te verschuiven en het onderscheid te verliezen, reserveert het schema er een letter voor.
Daaruit volgen drie praktische gevolgen. Een validator moet de letter op de laatste positie accepteren en alleen op de laatste positie, zodat een lichaam met een letter de tekenset niet haalt terwijl een afsluitende letter toegestaan is. Elke ontledingsstap die cijfers aanneemt, moet voor dat ene veld worden versoepeld. En de letter heeft één vorm, omdat de regel die vastlegt; eerst de lettervorm normaliseren is nog steeds het juiste instinct, maar de omzetting moet op de vorm uitkomen die het schema definieert.
Opslag is hier de stille fout. Een kolom met gehele getallen kan geen letter bevatten, en een routine die niet-cijfers verwijdert voordat ze controleert, schrapt precies het teken dat ze hoort te verifiëren. Identificatoren vanaf het begin in een tekstveld bewaren voorkomt een lastige migratie later.
Waarom streepjes moeten worden verwijderd voordat je controleert
Deze nummers worden in groepen gedrukt, en waar de streepjes vallen is een kwestie van presentatie die tussen uitgevers, systemen en landen verschilt. De groepering maakt geen deel uit van de identificator, en is niet overal hetzelfde voor hetzelfde nummer.
Omdat de groepen verschuiven, zal elke validatie die de reeks leest zoals gedrukt, onvoorspelbaar falen. De regel is om eerst te normaliseren: verwijder de scheidingstekens, verwijder omringende witruimte, normaliseer de lettervorm, en controleer dan pas de tekenset, de lengte en het afsluitende teken.
Daarom moet een validator ook de originele reeks naast de genormaliseerde bewaren. Het origineel is wat de gebruiker van de pagina heeft gelezen, en het is waarmee hij zal vergelijken wanneer de invoer verkeerd blijkt te zijn. De pijplijn die voor algemene nummervalidatie wordt beschreven maakt hetzelfde punt: het scheiden van presentatie van inhoud komt vóór elke rekenkunde.
Waarom moet een hernummerde titel onder beide nummers worden gecontroleerd?
Omdat een publicatie die de wisseling van systemen overbrugt, wettelijk twee identificatoren kan dragen, en beide kunnen nog ergens in de keten in gebruik zijn. Een catalogusrecord dat vóór de wisseling is gemaakt, kan de kortere vorm bevatten, terwijl de huidige lijst van een leverancier de langere bevat, en een systeem dat er slechts één begrijpt, meldt een mismatch waar er geen is.
Dit aanpakken is een matchingprobleem in plaats van een rekenkundig probleem. Beide vormen correct controleren vertelt je dat elke reeks intern consistent is; het vertelt je niet dat de twee reeksen dezelfde titel beschrijven. Die bewering vereist een koppeling die wordt onderhouden door wie de nummers heeft toegewezen, en de koppeling verzinnen door posities te strippen is een betrouwbare manier om twee ongerelateerde titels samen te voegen.
Het patroon is het veralgemenen waard naar elke heruitgegeven identificator. Wanneer een schema zijn lengte, zijn controleregel of zijn toewijzing wijzigt, verwacht dan een periode waarin beide generaties leven, en ontwerp het datamodel voor twee waarden in plaats van één.
Voor ontwikkelaars: normalisatie en foutmeldingen
Een korte lijst beslissingen dekt het meeste van de problemen die deze schema’s veroorzaken.
- Normaliseer door scheidingstekens te verwijderen en de lettervorm te normaliseren, en test dan het toegestane alfabet inclusief een toegestane afsluitende letter.
- Kies de regel uit het aantal cijfers, en houd de regels voor beide boeklengtes en voor series apart.
- Geef een melding terug die noemt welke regel is toegepast, zodat een gebruiker die het verkeerde soort nummer heeft geplakt, dat kan zien.
- Bewaar identificatoren overal als tekst, ook in databasekolommen en zoekindexen.
- Toon bij een mislukte waarde de genormaliseerde vorm waartegen je hebt getest, want dat is wat de rekenkunde werkelijk zag.
De rekenkunde zelf behoort tot dezelfde op modulus gebaseerde familie als degene die in het overzicht van controlecijferalgoritmen worden vergeleken, al maken het alfabet en de regel voor de afsluitende letter deze schema’s tot de lastige leden. Barcodes, die hetzelfde magazijn- of bibliotheeksysteem vaak naast elkaar verwerkt, komen aan bod in EAN UPC-controlecijfers.
Volgende stappen
Neem één waarde van elke generatie van het boeknummer en één serienummer, en bevestig dat je routine na normalisatie alle drie accepteert en elk afwijst wanneer één intern teken verandert. De nummervalidatietool laat je de tekst van de uitspraak zien, en het is de moeite waard na te gaan dat je interface een formaatverschil onderscheidt van een mislukte controlecijfertest.