ISBN - International Standard Book Number http://www.isbn-international.org/ Class/Package Name: ISBN Usage Examples: --------------- ISBN Validation: $bool_valid = (bool) ISBN::validate('ISBN 992-2878783-0'); $isbn = new ISBN('ISBN 992-2878783-0'); $bool_valid = $isbn->isValid(); ISBN Conversion: $isbn13 = ISBN::convert('0385339410'); $isbn13 = ISBN::convert('0385339410', ISBN_VERSION_ISBN_10, ISBN_VERSION_ISBN_13); $isbn10 = ISBN::convert('9780385339414', ISBN_VERSION_ISBN_13, ISBN_VERSION_ISBN_10); $isbn13 = ISBN::convert($anyisbn, ISBN::validate($anyisbn), ISBN_VERSION_ISBN_13); ISBN Handling: $isbn = new ISBN('ISBN 992-2878783-0'); echo "ISBN Registrationgroup is: " . $isbn->getGroup(); ISBN Output: $isbn = new ISBN('ISBN 3-89771-000-5'); echo $isbn->getISBNDisplayable(); /* echo'es ISBN-10: 3-89771-000-5 */ Reference: ---------- This class is based on the standards documented by the international ISBN Agency itself: ISBN-10: ISBN Users' Manual International edition; Berlin 2001; International ISBN Agency; Fourth, revised edition. (2001 Handbook) ISBN-13 & ISBN-13-978: ISBN Users' Manual International Edition; Berlin 2005; International ISBN Agency; Fifth Edition (2005 Handbook) ISBN-13-979: http://www.isbn-international.org/en/revision.html Because this class was developed within the changes from ISBN-10 to ISBN-13, it aims to support both versions and their formats. According to the international ISBN-Agency, ISBN-13 (ISBN-13-978) must be used in sole by 2007-01-01. ISBN-10 routines are part of ISBN-13-978 as well. The agency itself only states that the current standard definition is valid for about the next 10 years (as of 2005). Talks about ISBN-13 and ISO are still on the go, ISBN-13 might be something still in change. A change has been especially reserved in ISBN-13 based on the prefix (3 Digit EAN.UCC), meaning that 978 has other rules then 979 (2005 Handbook p.12). 979 is not used right now, an estimation by the international agency is, that its use might start around mid-2008. For further reference, you can see the numbering and versioning of ISBN numbers in the ISBN Version identifiers section which is according to the Version constants. ISBN Version constants (ISBN_*): -------------------------------- * VERSION_NONE META: not a version at all * VERSION_UNKNOWN FUZZY: input only: to pass an ISBN Number to the object with an unknown version * VERSION_ISBN_10 The ISBN Number valid until 2006-12-31 (2001 Handbook) * VERSION_ISBN_13 The ISBN Number valid on from 2007-01-01 (2005 Handbook) * VERSION_ISBN_13_978 ALIAS: same as VERSION_ISBN-13 * VERSION_ISBN_13_979 RESERVED: reserved, information still pending Underlaying ISBN Number Scheme: ------------------------------- ISBN Number (10 or 13 Digits + cosmetic chars) | /--------------+-------------\ | | | Prefix ISBN-Body Checkdigit (3 Digit @I-13) (9 Digit) (1 "Digit") | /---------+---------\ | | Registration ISBN-Subbody Group (4-8 Digits) (1-5 Digits) | | /------------+-----------\ | | Registrant Publication (1-7 Digits) (1-7 Digits) Notes: Prefix (3 Digit EAN.UCC) is available in ISBN-13 only. Checkdigit is a true Digit in ISBN-13, in ISBN-10 its a Char with value of 0-9 and "X" or "x". Registrant was also named Publisher and Publication was named Title or Title identifier sometimes. ISBN-Body and ISBN-Subbody are names used in this class only, not within the offical ISBN documentation. Validation: ----------- How well does the validation work? This class aims to enable the validation at the same level as the international ISBN Agency does publicly provide the data for it. That means, that the class is right now able to validate and split ISBN numbers into their parts for version ISBN-10 and ISBN-13-978. This includes checksum based validation that is not subject to change (calculation of the Checkdigit is safe) as well as validation based on the Group Identifier (which changes sometimes only) as well as Registrant ranges, that do change more often on an overall view (see below). It does not validate wether a specific Registrant exists nor does it validate that a specific publication exsists. These Validations enable the class to split an ISBN Number into all it's parts sothat the gathered data can be used to perform these more specific checks. If you need more information on any existing ISBN you need the annual book which is published by the international ISBN agency and a german publishing house which contains any ISBN number ever supplied. It is not known wehter this annual book handles duplicate use by certain publishers or not. If not, even the annual book is not complete. Validation Data: ---------------- The validationprocess is based on the one describben by the ISBN Handbook. The extraction of Registration and ISBN-Subbody is relativly safe, the source-data is documented within the sourcecode. Splitting the ISBN-Subbody is related to information that is subject to change. http://www.isbn-international.org/converter/ranges.js gives a first history of the revisions (DD.MM.YYYY): >> 20.12.2006; Added ranges for Palestine (9950) "00-29;300-840;8500-9999" 11.12.2006; Changed Serbia (86) "00-09;10-29;300-599;6000-7999;80000-89999;900000-999999";) 05.12.2006; Added Iran (600) 00-09;100-499;5000-8999;90000-99999 05.12.2006; Added Montenegro (9940) 0-1;20-49;500-899;9000-9999 05.12.2006; Added Georgia (9941) 0-0;10-39;400-899;9000-9999 20.11.2006; Changed Haiti (99935) 0-2;7-8;30-59;600-699;90-99 02.11.2006; Changed Ukraine (966) 00-19;2000-2999;300-699;700-8999;90000-99999 12.10.2006; Changed Turkey (9944) 0-2;300-499;5000-5999;60-89;900-999 11.10.2006; Corrected Nicaragua (99924) from 800 - 900 to 800-999 22.09.2006; Added Ecuador (9942) 00-89; 900-994; 9950-9999 15.09.2006; Added Uzbekistan (9943) 00-29; 300-399; 4000-9999 14.09.2006; Corrected Russia (5) 9909999 etc 07.09.2006: Corrected Greece (960) adding 7000-8499 21.08.2006: Altered Armenia (99941): 30-79; 800-999 30.07.2006: Altered Romania (973) 100-169;1700-1999 30.05.2006: Added: Bolivia (99954); 0-2; 30-69; 700-999; Srpska (99955); 0-1; 20-59; 600-899; 90-99 03.05.2006: Changed all 00-nn ranges to 00-09;10-nn 24.01.2006: Altered: Iran (964); 00-14;150-249;2500-2999; Moldova (9975) 0;100-399;4000-4499;45-89 23.01.2006: Added: Turkey (9944) 0-5; 60-89: 900-999; Paraguay (99953) 0-2; 30-79; 800-999; Altered: Romania (973) 0; 100-199 16.01.2006: Added: Algeria (9961) 0-2 Altered:gi.area9961.pubrange="0-2; 11.01.2006: Added: Indonesia (979) 000-099;1000-1499;15000-19999 21.11.2005: Added: Mali (99952) 0-4;50-79;800-999 16.11.2005: Altered: Romania (973) 85000-88999; 8900-9499; Added: Tajikistan (99947) 0-2; 30-69; 700-999 14.11.2005: Altered: Srpska (99938) 0-1;20-59; Added: Mongolia (99929) 0-4; 50-79; 800-999 26.10.2005: Altered: Botswana (99912) 0-3;400-599 24.8.2005: Corrected: Finland (952) 80-94 17.8.2005: Added: South Pacific (982) 00-09 12.8.2005: Added: Cambodia (99950) 0-4, 50-79, 800-999 Altered:Srpska (99938) 600-999 changed to 600-899, 90-99 18.7.2005: Altered: Italy (88) 900000-999999 changed to 900000-949999, 95000-99999 23.6.2005: Added / altered: Russia (5) 9910-9999 Turkey (975) 00000 - 00999, 990-999 (& changed 00-24 to 01-24) Argentina (987) 00-09 Kuwait (99906) 0-2, 70-89, 9-9 << As you can see, there are changes from time to time. These changes affect the correct implementation of splitting the ISBN Subbody into Registrant and Publication. There are relativly often alterings, so the Check is only as good as the data available. Since the JS-file already contains all information in a machine-readable way, I added a HTML-file to import the JS-file from isbn-international website and to create csv (comma seperated values) data which can be put into a file and loaded by the class. The script is placed in the tools folder (codegen.html), the ISBN Groups Data is placed in the data folder as groups.csv. Exampledata named ranges-YYYY-MM-DD.js has been placed in the tools folder as well. The .csv file should be updated from time to time to reflect the changes. ISBN-10 and ISBN-13 groups tend to be the same, so there is no need right now to implement one or more further __getISBN-XXGroups() function. According to the international ISBN Agency, even this .js file might contain minor errors (as of 2006-09-13). There are talks about providing an XML file with the data, which will make the whole process more failsafe. I'll update this package if more information is available. Parts of an ISBN: ----------------- When instantiated, the class provides version and validity information as well as the data of each ISBN parts since version 0.1.0. The parts are the following right now: Whole Number: ISBN->getISBN ISBN->setISBN Parts: ISBN->getEAN ISBN->getGroup ISBN->getPublisher ISBN->getTitle ISBN->getCheckdigit