身份证转换是指将15位身份证号码转换成18位身份证号码的一种操作。身份证是中国公民证明身份的重要证件,而目前大多数机构需要使用18位身份证号码进行识别和验证。下面将会从多个方面阐述身份证转换的细节和注意事项。
一、转换规则
1、15位身份证号码的规则:
第1-2位为数字表示所在省(直辖市、自治区)的行政区划代码,采用GB/T 2260;
第3-4位为数字表示所在市(地区)的行政区划代码,采用GB/T 2260;
第5-6位为数字表示所在区(县、自治县、县级市)的行政区划代码,采用GB/T 2260;
第7-8位为数字表示出生年份,采用YY表示法;
第9-10位为数字表示出生月份,采用MM表示法;
第11-12位为数字表示出生日,采用DD表示法;
第13-15位为顺序号,其中15位男为单数,女为双数;
2、18位身份证号码的规则:
第1-6位为数字表示所在省(直辖市、自治区)的行政区划代码,采用GB/T 2260;
第7-10位为数字表示所在市(地区)的行政区划代码,采用GB/T 2260;
第11-12位为数字表示所在区(县、自治县、县级市)的行政区划代码,采用GB/T 2260;
第13-14位为数字表示出生年份,采用YY表示法;
第15-16位为数字表示出生月份,采用MM表示法;
第17-18位为数字表示出生日,采用DD表示法;
第19-20位为数字表示所在地出生的顺序号,同时兼顾性别,其中女性的顺序号为奇数,男性的顺序号为偶数,即偶数为男性,奇数为女性;
第18位为校验码,使用ISO 7064:1983.MOD 11-2校验码系统计算出来的码数;
二、转换方法
1、生成校验码:身份证校验码基于ISO 7064:1983.MOD 11-2校验码系统,具体方法为:
将前17位数分别乘以不同的系数,其中第18个系数为2,然后将所得的18个乘积相加,用加和代替校验码位置上的数字,如果相加结果尾数为10,则校验码为X;
2、转换过程:
(1)将15位身份证号码的前6位升级到18位身份证的前6位升级(省/自治区/直辖市代码);
(2)增加第七、八位为“19”(年份升级前两位为19);
(3)将15位身份证的第7-12位补0,对应18位身份证的第9-14位(出生年月日);
(4)增加一位顺序号,男性为奇数,女性为偶数,对应18位身份证的第17位;
(5)生成校验码,对应18位身份证的第18位。
三、代码实现
public static String idCard15To18(String idCard){
String idCard18 = "";
if(idCard.length() != 15){
return null;
}
if(!isDigit(idCard)){
return null;
}
String provinceCode = idCard.substring(0,2);
String cityCode = idCard.substring(2, 4);
String districtCode = idCard.substring(4, 6);
String birthCode = "19" + idCard.substring(6, 12);
String orderCode = getGenderCode(idCard.substring(14, 15));
String verifyCode = getVerifyCode(idCard.substring(0,17));
idCard18 = provinceCode + cityCode + districtCode + birthCode + orderCode + verifyCode;
return idCard18;
}
private static boolean isDigit(String str) {
return str.matches("^[0-9]*$");
}
private static String getGenderCode(String str) {
int genderNum = Integer.parseInt(str);
if (genderNum % 2 == 0) {
return "2";
} else {
return "1";
}
}
private static String getVerifyCode(String id17) {
String[] sigma = new String[]{"1","0","X","9","8","7","6","5","4","3","2"};
String[] coefficient = new String[]{"7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2","1"};
int sum = 0;
for(int i=0;i<17;i++){
sum += Integer.parseInt(id17.substring(i,i+1)) * Integer.parseInt(coefficient[i]);
}
int remainder = sum % 11;
return sigma[remainder];
}
四、注意事项
1、转换后的18位身份证号码需要进行校验,以保证其真实性和有效性;
2、在身份证转换过程中,需要注意年份升级,一般为前两位追加19;
3、由于身份证转换主要是针对15位身份证号码的转换,因此在使用过程中要保证输入的号码长度为15位。