宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

一、身份证校验规则概述

身份证号码是我国公民唯一的身份凭证,其中包含了个人的基本信息和识别码,因此对其校验规则进行严格把控是非常必要的。身份证校验规则主要包括以下内容:

1、校验码的计算规则:身份证号码的最后一位(第18位)是校验码,通过对前17位的加权和计算得到。

2、身份证号码的长度规则:一般为18位,且不能少于15位。

3、地址码和出生日期码的规则:地址码和出生日期码有着严格的编码规则和对应关系。

4、校验码的特殊规则:校验码可能出现“X”字符,需要特殊处理。

二、身份证号码的校验码计算规则

身份证号码的最后一位为校验码,其计算方法如下:

// 完整身份证号码 18 位数字
// 如果是数字则转成 int 类型
// 如果最后一位是 X,在某些场景下需要转成小写 x
const idCardToArr = (idCard) => {
  if (typeof idCard !== 'string') {
    idCard = String(idCard)
  }
  let idCardArr = []
  const len = idCard.length
  for (let i = 0; i  {
  const idCardArr = idCardToArr(idCard)
  // 前 17 位数字和权重相乘求和
  let sum = 0
  for (let i = 0; i < 17; i++) {
    sum += parseInt(idCardArr[i], 10) * powers[i]
  }
  // 取模运算,得到校验码位置
  const mod = sum % 11
  return parityBit[mod]
}

三、身份证号码的长度规则与校验

身份证号码的长度一般为18位,其中前17位为地址码和出生日期码,最后一位为校验码。身份证号码长度不能少于15位,如果不符合长度规则,则为非法的身份证号码。

下面是一个验证身份证号码长度的示例:

function checkLength(idCard) {
  if (idCard.length != 18 && idCard.length != 15) {
    return false
  }
  else {
    return true
  }
}

四、地址码和出生日期码的规则与校验

身份证号码中的地址码和出生日期码有着严格的编码规则和对应关系。详细规则如下:

1、地址码:身份证号码前6位为地址码,使用行政区划码。行政区划码是国家规定的代码,用于区分地区,每个区域有唯一的行政区划码。地址码十分重要,它能够准确地反映出公民的户籍地。如果地址码不合规,说明身份证号码是非法的。

2、出生日期码:身份证号码的第7-14位为出生日期码,其中年份采用4位数字表示,月份和日期采用2位数字表示。出生日期码的规则如下:

(1)年份范围必须在1900年到2100年之间。

(2)月份范围必须在1月到12月之间。

(3)日期范围必须在1日到当月最大天数之间。

下面是一个验证地址码与出生日期码的示例:

function checkAddress(idCard) {
  const addressCode = idCard.substring(0, 6)
  if (!/^[\d]+$/.test(addressCode)) {
    return false
  }
  
  // TODO: 检查地址码是否合法

  const birthCode = idCard.substring(6, 14)
  const year = birthCode.substring(0, 4)
  const month = birthCode.substring(4, 6)
  const day = birthCode.substring(6, 8)

  // 检查年份
  if (year  2100) {
    return false
  }

  // 检查月份
  if (month  12) {
    return false
  }

  // 检查日期
  const date = new Date(year, month, 0)
  if (day  date.getDate()) {
    return false
  }

  return true
}

五、身份证号码中的校验码特殊规则

为了避免校验码出现“X”字符,身份证号码的规则进行了一些特殊的设计。如果校验码为“X”,需要转换成小写字母“x”才能对身份证号进行校验。下面是一个示例:

function checkX(idCard) {
  const idCardArr = idCardToArr(idCard)
  if (idCardArr[17] == 'x' || idCardArr[17] == 'X') {
    idCardArr[17] = 'x'
    return checkIDCard(idCardArr.join('')) == 'x'
  }
  else {
    return checkIDCard(idCard)
  }
}

六、总结

身份证号码的校验需要根据其规则进行逐一检验。对于身份证号码的长度、地址码、出生日期码和校验码,均有其特定的规则和校验方法。只有满足了所有规则和校验,才能判断身份证号码的合法性。