国际标准书号

维基百科,自由的百科全书
跳转至: 导航搜索

國際標準書號英语:International Standard Book Number缩写ISBN),是國際通用的圖書或獨立的出版物(定期出版的期刊除外)代碼。出版社可以通過國際標準書號清晰地辨認所有非期刊書籍。一個國際標準書號只有一個或一份相應的出版物與之對應。一本書的每一版或其他的變化,能夠申請到一個新的國際標準書號。新版本如果在原來舊版的基礎上沒有內容上太大的變動,在出版時不會得到新的國際標準書號。當一本書同時有平裝本精裝本出版時,平裝本的國際標準書號不得用於精裝本,反之亦然。

概述[编辑]

10碼國際標準書號(ISBN-10)及其13碼欧洲商品编码(EAN‑13)結構圖

一般來說,國際標準書號長度為是13碼或者10碼(在2007年1月1日之前)數字,由4或者5個部分組成:

  1. 如果13位數字的國際標準書號,一個GS1前導數字:通常為978或者979[1]
  2. 出版國家或者語言代碼
  3. 出版商代碼
  4. 書所分配到的號碼
  5. 檢查碼

13碼的國際標準書號通常被分成5個部分(10碼為4個部份),其不同部份以連字號(-)或空格清楚分開,位數是可變化的,連字號在系統處理上可被忽略;前導位數保證能確保這串數字能被判斷為國際標準书號。若有必要,連字符號必須被正確地標明;他們能使使用者較清楚判斷出數字與出版商及所屬國家的關係。

過去標準書號(Standard Book Number,簡稱SBN)無國家及語言代碼。國際標準書號出現後,多了國家代碼:0為美國,1為英語系國家,2為法語系國家,3為德語系國家,4為日本,5為俄語系國家,7為中國大陸等等。國家代碼最長可能為5位數字(例:不丹為99936),但相對剩下能使用、分配的位數就較為狹隘。

負責國家國際標準書號的機構會依出版社的大小來分配其位數範圍,出版商能擁有自己的代碼。沒有強制規定書上必須印製國際標準書號,但通常印製在版權頁及書底商品條碼上方。

出版商申請之後,能分配到國際標準書號的一個數字區域,機構會依使用量來預計出版商所需要的範圍並分配之,越大的出版商所取得的位數越小(如此代表書碼的範圍可以容納更多)。一旦發現所分配的數字區域不敷使用,出版商能再分配到另一個範圍供其使用,也就是再獲得一個出版商編號。因此,各國家及各出版社的國際標準書號位數會因其狀況來做最好的分配。

國際標準書號的發展[编辑]

  • 1960年代 - 倫敦經濟學院和大不列顛出版聯合會(Publisher Association of Great Britain)提出了制定一個清晰且國際統一的書籍編號的想法。
  • 1966年11月 - 西柏林第三屆國際圖書市場研究和圖書貿易合理化會議上正式達成一致。
  • 1967年 - 英國圖書業界首先創立這套編號系統,從英語國家先行試用。
  • 1968年 - 国际标准化组织採納了這個建議,並馬上組建了工作小組予以實施。
  • 1972年 - 国际标准化组织正式將國際標準書號訂定為國際標準,並在柏林國家圖書館成立國際標準書號總部,業務為審核管理各地區的申請案件、分配群體識別號及協助各地標準書號制度的建立。
  • 1976年 - 香港引入國際標準書號系統。
  • 1986年 - 中华人民共和国引入國際標準書號系統。
  • 1988年 - 新加坡引入國際標準書號系統。
  • 1989年 - 中华民国引入國際標準書號系統。
  • 2000年 - 因澳門回歸澳门的代码脱离原来葡萄牙的"972",改以"99937"。如澳門基金會出版的書籍由原來的「972-658」更改為「99937-1」。
  • 2006年7月1日至2006年12月31日 - 10碼與13碼並行期,為ISBN由10碼改為13碼作準備階段。
  • 2007年1月1日 - 國際標準書號的格式全面由10位修訂為13位。

10位國際標準書號(ISBN-10)[编辑]

出版社應將其於2007年1月仍會流通使用的ISBN-10書號(包括存貨清單上的圖書),轉換為ISBN-13格式。

2007年1月1日之後出版的新書,必須編配新的ISBN-13位書號。

13位國際標準書號(ISBN-13)的構成[编辑]

國際標準書號号码由13位数字组成,并以三個連接號或三個空格加以分割,每组数字都有固定的含义。

第一组:978或979。

第二组:國家、語言或区位代码[a] 各国ISBN国际标准书号代码舉例

国家或地区 国际标准书号代码 语言
 美國 978-0 978-1 英语
 英國 爱尔兰 978-0 978-1 英语、威尔士语、盖尔语
 澳大利亚 978-0 978-1 英语
 加拿大 978-0 978-1 978-2 英语、法语
 新西蘭 978-0 978-1 英语
 南非 978-0 978-1 英语、祖鲁语、南非荷兰语
 辛巴威 978-0 978-1 英语
 斯威士兰 978-0 英语、斯瓦蒂语
 直布罗陀 978-0 978-1 英语、西班牙语
 法国 978-2 979-10 法语、科西嘉语
 比利時 978-2 法语、德语、荷兰语<弗拉芒语>
 瑞士 978-2 978-3 法语、德语、意大利语、罗曼语
 卢森堡 978-2 978-99959 法语、德语、卢森堡语
 德國 978-3 德语
 奥地利 978-3 德语
 日本 978-4 日语
 俄羅斯(含 蘇聯 978-5 俄语
 伊朗 978-600 978-964 波斯语
 哈萨克斯坦 978-601 978-9965 哈萨克语、俄语
 印尼 978-602 978-979 印度尼西亚语、英语
 沙烏地阿拉伯 978-603 978-9960 阿拉伯语
 越南 978-604 越南语
 土耳其 978-605 978-975 978-9944 土耳其语、库尔德语
 羅馬尼亞 978-606 978-973 罗马尼亚语
 墨西哥 978-607 978-968 978-970 墨西哥语
 馬其頓 978-608 马其顿语
 立陶宛 978-609 978-9955 978-9986 立陶宛语、俄语
 泰國 978-611 978-616 978-974 泰语
 秘魯 978-612 978-9972 西班牙语
 模里西斯 978-613 978-99903 978-99949 英语、法语、克里奥尔语
 黎巴嫩 978-614 978-9953 阿拉伯语、法语、英语
 匈牙利 978-615 978-963 匈牙利语
 希臘 978-618 978-960 希腊语
 保加利亚 978-619 978-954 保加利亚语
 中华人民共和国 978-7 简体中文
 捷克 978-80 捷克语
 斯洛伐克 978-80 斯洛伐克语
 印度 978-81 978-93 印地语、英语
 挪威 978-82 挪威语
 波蘭 978-83 波兰语、世界语
 西班牙 978-84 西班牙语、加泰罗尼亚语
 巴西 978-85 葡萄牙语
 塞爾維亞 978-86 塞尔维亚语
 丹麥 978-87 丹麦语
 義大利 978-88 意大利语
 大韓民國 978-89 韩语
 荷蘭 978-90 978-94 荷兰语
 瑞典 978-91 瑞典语
 歐盟 978-92
国际非政府组织 978-92
 阿根廷 978-950 978-987 西班牙语
 芬兰 978-951 978-952 芬兰语、瑞典语
 克罗地亚 978-953 克罗地亚语
 斯里蘭卡 978-955 僧伽罗语,泰米尔语
 智利 978-956 西班牙语
 中華民國 978-957 978-986 正體中文
 哥伦比亚 978-958 西班牙语
 古巴 978-959 西班牙语
 斯洛維尼亞 978-961 斯洛文尼亚语
 香港 978-962 978-988 繁體中文、英语
 以色列 978-965 希伯来语、阿拉伯语
 马来西亚 978-967 马来语、英语、简体中文
 巴基斯坦 978-969 英语
 菲律賓 978-971 菲律宾语、英语
 葡萄牙 978-972 978-989 葡萄牙语
 加勒比共同体 978-976 英语
 埃及 978-977 阿拉伯语
 奈及利亞 978-978 英语、豪萨语、约鲁巴语、伊博语
 委內瑞拉 978-980 西班牙语
 新加坡 978-981 978-9971 英语、简体中文、马来语、泰米尔语
南太平洋 978-982 英语
 孟加拉 978-984 英语、孟加拉语
 白俄羅斯 978-985 俄语、白俄罗斯语
 卡塔尔 978-9927 978-99921 阿拉伯语、英语
 阿尔巴尼亚 978-9928 978-99927 阿尔巴尼亚语
 危地马拉 978-9929 978-99922 978-99939 西班牙语
 哥斯达黎加 978-9930 978-9968 978-9977 西班牙语
 阿尔及利亚 978-9931 978-9947 阿拉伯语、法语
 老挝 978-9932 老挝语
 叙利亚 978-9933 阿拉伯语、英语、法语
 拉脫維亞 978-9934 978-9984 拉脱维亚语、俄语
 冰島 978-9935 978-9979 冰岛语
 阿富汗 978-9936 波斯语
 尼泊尔 978-9937 978-99933 978-99946 尼泊尔语、英语
 突尼西亞 978-9938 978-9973 阿拉伯语
 亞美尼亞 978-9939 978-99930 亚美尼亚语
 蒙特內哥羅 978-9940 978-86 塞尔维亚语、黑山语
 格鲁吉亚 978-9941 978-99928 978-99940 格鲁吉亚语、俄语
 厄瓜多尔 978-9942 978-9978 西班牙语
 乌兹别克斯坦 978-9943 乌兹别克语、俄语
 多米尼加 978-9945 西班牙语、英语
 朝鲜 978-9946 朝鲜语
 阿联酋 978-9948 阿拉伯语、英语
 爱沙尼亚 978-9949 978-9985 爱沙尼亚语、俄语
 巴勒斯坦 978-9950 阿拉伯语
 科索沃 978-9951 阿尔巴尼亚语、塞尔维亚语
 阿塞拜疆 978-9952 阿塞拜疆语、俄语
 摩洛哥 978-9954 978-9981 阿拉伯语、法语、西班牙语
 喀麦隆 978-9956 法语、英语
 约旦 978-9957 阿拉伯语
 波斯尼亚和黑塞哥维那 978-9958 波斯尼亚语、塞尔维亚语、克罗地亚语
 利比亞 978-9959 阿拉伯语
 巴拿马 978-9962 西班牙语
 賽普勒斯 978-9963 希腊语、土耳其语
 加纳 978-9964 978-9988 英语
 肯尼亚 978-9966 斯瓦希里语、英语
 乌干达 978-9970 英语、斯瓦西里语、卢干达语
 乌拉圭 978-9974 西班牙语
 坦桑尼亚 978-9976 978-9987 斯瓦西里语、英语
 巴布亚新几内亚 978-9980 英语、巴布亚皮钦语
 尚比亞 978-9982 英语
 冈比亚 978-9983 英语
 巴林 978-99901 978-99958 阿拉伯语、英语
 加彭 978-99902 法语
 荷属安的列斯 阿鲁巴 978-99904 荷兰语、英语、西班牙语、帕彼曼都语
 玻利维亚 978-99905 978-99954 西班牙语
 科威特 978-99906 阿拉伯语、英语
 马拉维 978-99908 978-99960 英语、奇契瓦语
 馬爾他 978-99909 978-99932 978-99957 马耳他语、英语
 塞拉利昂 978-99910 英语
 安道尔 978-99913 978-99920 加泰罗尼语
 苏里南 978-99914 荷兰语
 馬爾地夫 978-99915 迪维希语
 纳米比亚 978-99916 978-99945 英语、荷兰语
 文莱 978-99917 马来语、英语
 法罗群岛 978-99918 法罗语、丹麦语
 贝宁 978-99919 法语
 薩爾瓦多 978-99923 978-99961 西班牙语
 尼加拉瓜 978-99924 978-99964 西班牙语
 巴拉圭 978-99925 978-99953 西班牙语、瓜拉尼语
 宏都拉斯 978-99926 西班牙语
 蒙古 978-99929 978-99962 喀尔喀蒙古语
 塞舌尔 978-99931 克里奥尔语、英语、法语
 海地 978-99935 法语、克里奥尔语
 不丹 978-99936 不丹语<宗卡语>、英语
 澳門 978-99937 978-99965 繁體中文、葡萄牙语
 塞爾維亞 978-99938 978-99955 塞维维亚语
 苏丹 978-99942 阿拉伯语、英语
 衣索比亞 978-99944 阿姆哈拉语、英语、意大利语
 柬埔寨 978-99950 978-99963 高棉语、英语、法语
 刚果(布) 978-99951 法语、刚果语、莫努库图巴语、林加拉语
 马里 978-99952 法语、班巴拉语
 阿曼 978-99969 阿拉伯语


第三组:出版社代码[b]

由各国家或地區的国际标准书号分配中心,分给各个出版社。

第四组:书序码

该出版物代码,由出版社具体给出。

第五组:校验码

只有一位,从0到9。

校驗碼的計算方法[编辑]

10位[编辑]

  1. 假設某國際標準書號號碼前9位是:7-309-04547
  2. 計算加權和
  3. 计算的餘數
  4. 計算 的差
  • 如果,校驗碼是字母「X」;
  • 如果,校驗碼是數字「0」;
  • 如果為其他數字,校驗碼是數字

所以,本書的校驗碼是5,故該國際標準書號為 ISBN 7-309-04547-5

這裡是一個計算檢查碼的Visual Basic脚本。 複制以下代碼到記事本並另存為vbs格式,即可在Windows系统上使用。

 isbn = InputBox("Please input ISBN", "ISBN")
 k = ""
 For i = 1 To Len(isbn)
     s = Mid(isbn, i, 1)
     If s <> "-" Then
         k = k & s
     End If
 Next
 If Len(k) <> 9 Then
     MsgBox "Wrong Input"
 End If
 a = 0
 For i = 1 To 9
     a = a + (11 - i) *Mid(k, i, 1)
 Next
 a = a Mod 11
 a = 11 - a
 If a = 10 Then
     isbn = isbn & "-X"
 Else
     If a = 11 Then
         isbn = isbn & "-0"
     Else
         isbn = isbn & "-" & a
     End If
 End If
 MsgBox isbn


這裡是一個計算檢查碼的JavaScript脚本。

/*	國際標準書號查核
	輸入國際標準書號可測試是否正確,若輸入不完全的(僅缺檢查積),則會輸出完全碼
*/
function checkISBN10(code){
	code=(code+'').replace(/[-\s]/g,'');
	if(!/^\d{9}[\dxX]?$/.test(code))return;
	var i=0,c=0;	//	c:checksum
	for(;i<9;)
		c+=code.charAt(i++)*i;
	c%=11;if(c==10)c='X';
	if(code.length==9)return code+c;
	return c==(i=code.charAt(9))||c=='X'&&i=='x';
}
function checkISBN13(code){
	code=(code+'').replace(/[-\s]/g,'');
	if(!/^\d{12,13}$/.test(code))return;
	var i=1,c=0;	// c:checksum
	for(;i<12;i+=2)
		c+=Math.floor(code.charAt(i));
	for(c*=3,i=0;i<12;i+=2)
		c+=Math.floor(code.charAt(i));
	c=(220-c)%10;	// 220:大於(1*6+3*6),%10==0即可。
	if(code.length==12)return code+c;
	return c==code.charAt(12);
}


這裡是一個計算檢查碼的Haskell代码。

getLastCode :: String -> Char 
getLastCode xs 
    | isbnSize == 9  = iSBN10lastcode (stdISBN xs)
    | isbnSize == 12 = iSBN13lastcode (stdISBN xs)
    | otherwise      = error "the given invalid code"	
    where isbnSize = length (stdISBN xs)


stdISBN :: String -> String
stdISBN xs = [x | x<-xs, elem x ['0'..'9']] 

iSBN13lastcode :: String -> Char
iSBN13lastcode xs 
  | res == 10 = '0'
  | otherwise = i2char res
  where res = 10 - ((sum (zipWith (*) (str2Int xs) (take 12 (cycle [1,3])))) `mod` 10)

iSBN10lastcode :: String -> Char
iSBN10lastcode xs
  | res == 11 = 'X'
  | res == 10 = '0'
  | otherwise = i2char res
  where res = 11 - ( (sum (zipWith (*) (str2Int xs) [9,8..2] ) ) `mod` 11 )

str2Int :: String -> [Integer]
str2Int xs = [ atoi x | x <- xs]

atoi :: Char -> Integer
atoi ch = case ch of '0' -> 0
	             '1' -> 1
	             '2' -> 2
	             '3' -> 3
	             '4' -> 4
	             '5' -> 5
	             '6' -> 6
	             '7' -> 7
	             '8' -> 8
	             '9' -> 9
	             otherwise  -> -1 

i2char :: Integer->Char
i2char x = ['0'..'9'] !! fromInteger x
}


這裡是一個計算檢查碼的C代码。

/*  这个C程序算出校验码
 *  
 *  用例:  isbn [--code 9位编号或者12位编号]
 *  输出:  校验码
 */

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

enum BOOL {NO = 0, YES = 1};
typedef enum BOOL BOOL;

const int ISBN10 = 10;
const int ISBN13 = 13;
const int BUFF   = 30;

char* stdisbn(const char* inputCode, const int inputCodeLen, char* isbn);  /* drop useless chars in the input code  */
BOOL  isFullISBN(const char* isbn);
BOOL  isISBNWithoutLastDigit(const char* isbn);
char  ISBN10lastdigit(const char* isbn);
char  ISBN13lastdigit(const char* isbn);
BOOL  validFullISBN(const char* isbn, const size_t isbnSize); 


int main(int argc, char* argv[])
{
    char inputCode[BUFF];
    char* dash_code = "--code";

    if ( argc == 1 ) {
        printf("ISBN: ");
        fgets(inputCode, BUFF, stdin);
    } else if (argc == 3 && strcmp(argv[1], dash_code) == 0 ) {
	memcpy(inputCode, argv[2], strlen(argv[2]) + 1);
    } else {
        printf("USAGE: isbn \nUSAGE: isbn --code [ISBN code]\n");
	return 0;
    }

    char* isbn = NULL;       /* the pointer to the standard ISBN code */ 
    isbn = stdisbn(inputCode, strlen(inputCode)+1, isbn);

    if ( isFullISBN(isbn) ) {
	if ( validFullISBN( isbn, strlen(isbn) ) )
            printf("the input code is a valid ISBN.\n");
	else { 
            printf("the input code is not a valid ISBN.\n");
        }
    } else if ( isISBNWithoutLastDigit(isbn) ) {
	int ISBNLEN;
	char lastdigit;
        ISBNLEN = strlen( isbn ) + 1; 
	if (ISBNLEN == ISBN13)
           lastdigit = ISBN13lastdigit(isbn); 
	} else { 
	   lastdigit = ISBN10lastdigit(isbn);
	}
         
	printf("the last digit is: %c\n", lastdigit);
	printf("the full ISBN is: %s%c \n", isbn, lastdigit); 
   } else {
	fflush(stdout);
        fprintf(stderr, "The given code is NOT a valid ISBN.\n"); 
	fflush(stdout);
   }

   free(isbn);
   isbn = NULL;
         
   return 0;
}

char* stdisbn(const char* inputCode, const int inputCodeLen, char* isbn)
{
    char std[inputCodeLen];
    int idx = 0;
    for (int i =0; inputCode && i < inputCodeLen; ++i ) {
        if ( isdigit(inputCode[i]) ) {
	   std[idx] = inputCode[i]; 	
	   idx++;
	}
    }
    std[idx] = '\0';
    isbn = (char*) malloc(sizeof(char) * idx+1 );
    if (!isbn) {
	fflush(stdout);
	fprintf(stderr, "cannot allocate memory for char* isbn in stdisbn()\n");
	fflush(stdout);
	exit(-1);
    }
    memcpy(isbn, std, idx+1);
	
    return isbn;
}

BOOL isFullISBN(const char* isbn)
{
    return ( strlen(isbn) == ISBN10 || strlen(isbn) == ISBN13 )? YES : NO; 
}

BOOL isISBNWithoutLastDigit(const char* isbn)
{
    return ( strlen(isbn) == ISBN13 -1 || strlen(isbn) == ISBN10 -1 ) ? YES : NO;
}

char ISBN10lastdigit(const char* isbn)
{
   char res;
   int sum = 0;
   for (int i = 0; i < ISBN10 - 1; ++i ) {
      sum += (isbn[i] - '0') * (ISBN10 - i); 	   
   }
   sum = 11 - sum % 11;
   switch (sum) {
   case 10 : 
      res = 'X';     	   
	  break;
   case 11 :
      res = '0';
	  break;
   default:
      res = sum + '0';
	  break;
   }
   return res;
}

char ISBN13lastdigit(const char* isbn)
{
    int res = 0;
    for (int i = 0; i < ISBN13 - 1; ++i ) {
        if ( i % 2 == 0 ) {
            res += (isbn[i] - '0');
	} else {
            res += 3 * (isbn[i] - '0');
	}
    }
    res = 10 - res % 10;
    return res == 10 ? '0' : res + '0';
}

BOOL validFullISBN(const char* isbn, const size_t isbnSize)
{
    char currentLastCode = isbn[isbnSize-1];
    char validLastCode;
    if (isbnSize == ISBN10)
	validLastCode = ISBN10lastdigit(isbn);
    else 
	validLastCode = ISBN13lastdigit(isbn);
		
    return validLastCode == currentLastCode ? YES : NO; 	 
}


ISBN-10(左)與 ISBN-13(右)的分別

13位[编辑]

  1. 假設某國際標準書號號碼前12位是:978-986-181-728;
  2. 計算加權和
  3. 計算的餘數
  4. 計算 的差;
  • 如果,校驗碼是數字「0」;
  • 如果為其他數字,校驗碼是數字。;

所以,本書的校驗碼是6。完整的國際標準書號號碼為 ISBN 978-986-181-728-6;

依據: ISBN Users'Manual = [國際標準書號使用者手冊] / International ISBN Agency. -- International Edition, Fifth Edition. -- Berlin : International ISBN Agency, 2005. -- ISBN 3-88053-113-7. 第10頁 4.5 Check digit

13位國際標準書號(ISBN-13)與 13位歐洲商品編碼[编辑]

EAN:European Article Number(歐洲商品號),國際標準書號中心於2004年決定在國際標準書號的基礎上再添加一組三位數字在最前,即將現有的10位書號前面加上前綴號「978」或「979」及重新計算稽核號,以轉換為新的13位格式,與13位歐洲商品編碼相同。該計劃於2007年1月1日實施[2]

這裡是一個計算ISBN-13校驗碼的Microsoft Excel腳本。

M1的格子貼上以下程式碼:
=10-MOD((A1+C1+E1+G1+I1+K1)+(B1+D1+F1+H1+J1+L1)*3,10)
則前面的格子依序填入前十二碼,就可以出現國際標準書號的校驗碼了。

其它国际标准出版物编码[编辑]

书号申请[编辑]

出版社获得国际标准书号的途径在各地有所不同,或經申请、或經核发。通常由該國的法定圖書收藏機構(全國各出版社需在圖書出版前繳一份到該機構以編目)申請或發配国际标准书号,例如:台灣出版的著作須向國家圖書館申請国际标准书号,香港由香港公共圖書館轄下書刊註冊組負責,日本則向國立國會圖書館国立国会図書館)申請。

注释[编辑]

  1. ^ 詳細區位列表見國際標準書號代碼表
  2. ^ 中國大陸地區詳細出版社名單見中國出版社的國際標準書號代碼表

参考文献[编辑]

外部連結[编辑]

参见[编辑]