README
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);
ISBN Handling:
$isbn = new ISBN('ISBN 992-2878783-0');
echo "ISBN Registrationgroup is: " . $isbn->getGroup();
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 the needed code for the class. You can
find it in the tools folder, it is named codegen.html. Exampledata named
ranges.js has been placed in the tools folder as well. The function
__getISBN-10Groups() 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
|