首页 新闻动态 知识

ISBN-13与ISBN-10互相转换算法

发布时间:2025-04-09 18:11 点击:112

  2007年ISBN从10位升级为13位,新增前缀“978”或“979”以兼容欧洲商品编码(EAN),并与全球贸易条形码系统统一。这就涉及到了ISBN-13与ISBN-10的相互转化问题。下面用PHP展示转化逻辑:


/**
 * 将ISBN-13转换为ISBN-10
 * 
 * @param string $isbn 输入的ISBN-13字符串
 * @return string 返回ISBN-10字符串,如果输入无效则返回空字符串
 */
function to10($isbn)  
{  
    $isbn = str_replace('-', '', $isbn);  
    if(!preg_match('/^\d+x?$/i', $isbn)) return '';  
        
    if(strlen($isbn) == 10) return $isbn; 
        
    $sum = 0;  
    $num = substr($isbn, 3, 9);  
    for($i = 10, $p = 0; $i > 1; $i--, $p++){  
        $sum += $i * intval($num[$p]);  
    }  
        
    $m = $sum % 11;  
        
    $check = 11 - $m;  
        
    if($check == 10) $check = 'x';          
    elseif($check == 11) $check = '0';  
        
    return $num . $check;  
}


/**
 * 将ISBN-10转换为ISBN-13
 * 
 * @param string $isbn 输入的ISBN-10字符串
 * @return string 返回ISBN-13字符串,如果输入无效则返回空字符串
 */
function to13($isbn)  
{  
    $isbn = str_replace('-', '', $isbn);  
    if(!preg_match('/^\d+x?$/i', $isbn)) return '';  
        
    if(strlen($isbn) == 13) return $isbn;  
        
    $sum = 0;  
    $num = '978' . substr($isbn, 0, 9);  
        
    for($i = 0; $i < 12; $i++){  
        $n = intval($num[$i]);
        if(($i + 1) % 2 == 0){  
            $sum += $n * 3;
        }else{
            $sum += $n;
        }
    }
    $m = $sum % 10;
    $check = 10 - $m;
    return $num . $check;  
}