大陆的身份证为18位,老的身份证是15位。
关于身份证第18是怎么计算的,原理如下:根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码(身份证前六位)表示编码对象常住户口所在县(市、旗、区)的行政区划代码。(所有区域的编码可以到这个网站http://www.stats.gov.cn/tjbz/index.htm
查询到最新的县及县以上的行政编码资料。)
生日期码(身份证第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。
顺序码(身份证第十五位到十七位)为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。
校验码(身份证最后一位)是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

第十八位数字的计算方法为:
1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.将这17位数字和系数相乘的结果相加。
3.用加出来和除以11,看余数是多少?
4余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。

例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
首先:我们得出,前17位的乘积和是189
然后:用189除以11得出的结果是17 + 2/11,也就是说余数是2。
最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。

————————————————————————————————————————————————
备注说明:关于大陆身份证有的人会发现前几位为什么变化了。这主要出现在中国的重庆。原有的重庆人的身份证多数以51开头。以前隶属于四川的原因。但新办的身份证可能是50开头,原因是行政区划改变所致。中国各地的行政区划代码请参考国家统计局网站http://www.stats.gov.cn/tjbz/index.htm
参考资料:http://spaces.msn.com/members/kinworld




身份证查询
< script>
function checkCard()
{
if(document.cardForm.strCard.value == "")
{
alert("请输入你的身份证号码");
return false;
}
var filter=/^s*[xX0-9]{15,18}s*$/;
if (!filter.test(document.cardForm.strCard.value))
{
alert("可使用的字符为(0-9,x,X)长度不小于15个字符,不超过18个字符。");
return false;
}
//可使用的字符为(0-9,xX)长度不小于15个字符,不超过18个字符。
this.cardForm.submit();
}
< /script>


<%
dim strCard2,action
strCard2 = Trim(Request("strCard"))

action = Trim(Request("action"))
if action = "save" then
if len(strCard2) <> 18 then
response.write ""
end if
response.write "你输入的身份证号码:"&strCard2 & ""
response.write "(暂时只支持身份证号码为18位的查询)
"
int cardLength
cardLength = len("strCard2")
dim card(9)
card(0) = left(strCard2,2)'省份
card(1) = mid(strCard2,3,6)'具体城市
card(2) = mid(strCard2,7,4)'出生年份
card(3) = mid(strCard2,11,2)'出生月份
card(4) = mid(strCard2,13,2)'出生哪天
card(5) = mid(strCard2,15,3)'随机数
card(6) = mid(strCard2,17,1)'男性/女性
card(7) = right(strCard2,1)'验证码
dim strProvince
select case(card(0))
case 11 strProvince = "北京"
case 12 strProvince = "天津"
case 13 strProvince = "河北"
case 14 strProvince = "山西"
case 15 strProvince = "内蒙古"
case 21 strProvince = "辽宁"
case 22 strProvince = "吉林"
case 23 strProvince = "黑龙江"
case 31 strProvince = "上海"
case 32 strProvince = "江苏"
case 33 strProvince = "浙江"
case 34 strProvince = "安徽"
case 35 strProvince = "福建"
case 36 strProvince = "江西"
case 37 strProvince = "山东"
case 41 strProvince = "河南"
case 42 strProvince = "湖北"
case 43 strProvince = "湖南"
case 44 strProvince = "广东"
case 45 strProvince = "广西"
case 46 strProvince = "海南"
case 50 strProvince = "重庆"
case 51 strProvince = "四川"
case 52 strProvince = "贵州"
case 53 strProvince = "云南"
case 54 strProvince = "西藏"
case 62 strProvince = "陕西"
case 64 strProvince = "青海"
case 65 strProvince = "新疆"
case 71 strProvince = "台湾"
case 81 strProvince = "香港"
case 82 strProvince = "澳门"
case 91 strProvince = "国外"
case else strProvince = "哈哈,恭喜你发现了新大陆啦!"
End Select
dim randomIsRight,randomNums
randomIsRight = false
randomNums = 0

for i = 1 to len(strCard2)
randomNums = randomNums + cint(mid(strCard2,i,1)) * cint(getCoefficient(i))
'response.write cint(mid(strCard2,i,1)) &" " & cint(getCoefficient(i)) &" " & randomNums & "
"
Next
dim dividedNums,lastIdentifyingNum
'response.write randomNums
dividedNums = randomNums mod 11
'response.write "******" & dividedNums

'余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
select case dividedNums
case 0 lastIdentifyingNum = "1"
case 1 lastIdentifyingNum = "0"
case 2 lastIdentifyingNum = "X"
case 3 lastIdentifyingNum = "9"
case 4 lastIdentifyingNum = "8"
case 5 lastIdentifyingNum = "7"
case 6 lastIdentifyingNum = "6"
case 7 lastIdentifyingNum = "5"
case 8 lastIdentifyingNum = "4"
case 9 lastIdentifyingNum = "3"
case 10 lastIdentifyingNum = "2"
case else lastIdentifyingNum = ""
end select
'response.write "-----------"
'response.write lastIdentifyingNum & "---"
'response.write card(7)
if lastIdentifyingNum = cstr(card(7)) then
response.write "
身份证号码正确!"
else
response.write "
身份证号码不正确,正确的为 "& left(strCard2,17) & lastIdentifyingNum & "
"
end if

if card(6) mod 2 = 0 then
response.write "女性 "
else
response.write "男性 "
end if

Response.Write "出生地:"&strProvince& " "
Response.Write "出生年月:"&card(2)&"年"&card(3)&"月"&card(4)&"日"
'for i = 0 to cardLength

'Next
end if
'7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
Function getCoefficient(intNums)
select case(intNums)
case 1 getCoefficient = 7
case 2 getCoefficient = 9
case 3 getCoefficient = 10
case 4 getCoefficient = 5
case 5 getCoefficient = 8
case 6 getCoefficient = 4
case 7 getCoefficient = 2
case 8 getCoefficient = 1
case 9 getCoefficient = 6
case 10 getCoefficient = 3
case 11 getCoefficient = 7
case 12 getCoefficient = 9
case 13 getCoefficient = 10
case 14 getCoefficient = 5
case 15 getCoefficient = 8
case 16 getCoefficient = 4
case 17 getCoefficient = 2
case else getCoefficient = 0
end select
End Function
%>