台湾地区 居民身份识别证件编码规则

类别:编程语言 点击:0 评论:0 推荐:

--写给C++ Builder Win32 SDK/API 论坛

声明:所有转载需要注明 URL 原始链接。这些链接应当来自于www.csdn.com。



    这里介绍的是我在net上搜集摘抄的。可能不准。也可能失效。

大概年份在 1995 左右。有没有新的规定,别见笑,我还没查到。

写这篇文档的目的是向我们的程序员介绍编码规则,以便需要

证件识别的程序适宜台湾地区使用,扩大程序的应用空间。

技术人谈技术,乐此不疲。

说正题:

1、简述:

证件编码 由 10 位组成。

首位是英文字母,代表区域划分。有对应的数字代号表示。

末位是校验用,用以验证证件编码的有效性。

2、首位字母,代号,区域 对应表:

/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\
╓------------------------------------------╖
║   字母、代号、区域  对应表         ║
╟====┬=======┬=======┬===╢
║ 代号 |    繁体     |     简体     |  字 ║
╟====+========+========+===╢
║  10   | 臺北市      | 台北市      | A   ║
╟====+========+========+===╢
║ 11    | 臺中市      | 台中市      | B   ║
╟====+========+========+===╢
║ 12    | 基隆市      | 基隆市      | C   ║
╟====+========+========+===╢
║ 13    | 臺南市      | 台南市     | D    ║
╟====+========+========+===╢
║ 14    | 高雄市     | 高雄市      | E   ║
╟====+========+========+===╢
║ 15    | 臺北縣      | 台北县      | F   ║
╟====+========+========+===╢
║ 16    | 宜蘭縣      | 宜兰县      | G   ║
╟====+========+========+===╢
║ 17    | 桃園縣      | 桃园县      | H   ║
╟====+========+========+===╢
║ 18    | 新竹縣      | 新竹县      | J    ║
╟====+========+========+===╢
║ 19    | 苗栗縣      | 苗栗县      | K   ║
╟====+========+========+===╢
║ 20    | 臺中縣      | 台中县     | L   ║
╟====+========+========+===╢
║ 21    | 南投縣      | 南投县     | M  ║
╟====+========+========+===╢
║ 22    | 彰化縣      | 彰化县     | N   ║
╟====+========+========+===╢
║ 23    | 雲林縣      | 云林县     | P   ║
╟====+========+========+===╢
║ 24    | 嘉義縣      | 嘉義县      | Q   ║
╟====+========+========+===╢
║ 25    | 臺南縣      | 台南县      | R   ║
╟====+========+========+===╢
║ 26    | 高雄縣      | 高雄县      | S   ║
╟====+========+========+===╢
║ 27    | 屏東縣      | 屏東县      | T   ║
╟====+========+========+===╢
║ 28    | 花蓮縣      | 花莲县      | U   ║
╟====+========+========+===╢
║ 29    | 臺東縣      | 台东县      | V   ║
╟====+========+========+===╢
║ 30    | 澎湖縣      | 澎湖县      | X   ║
╟====+========+========+===╢
║ 31    | 陽明山      | 陽明山      | Y   ║
╟====+========+========+===╢
║  32   |                 |                  | W  ║
╟====+========+========+===╢
║ 33    |                 |                  | Z   ║
╟====+========+========+===╢
║ 34    | 嘉義市      | 嘉義市      | I    ║
╟====+========+========+===╢
║ 35    | 新竹市      | 新竹市      | O   ║
╙====┴=======┴=======┴===╜

(表一)

3、编号计算:

3.1描述

第一步:按照 表一 将字母转换为数字。

第二步:新组成的编号对应位乘以 1987654321的对应位。

第三步:将所有对应位乘的乘积作累加和。

第四步:将累加和 mod 10 得模数。

第五步:10 - 模数 得到校验码。

第六步:将校验码与编码的末位作比较。

ok.

3.2例子

令 编号为: A 1 0 0 9 8 7 6 3 8 

查 表一 知:

A --->10.

组成新编号 1 0 1 0 0 9 8 7 6 3 8 

对应位相乘:

1 0 1 0 0 9 8 7 6 3 8 新编号
* 1 9 8 7 6 5 4 3 2 1 常數
-----------------------------------------------------
(1) (0) (8) (0) (0) (45) (32) (21) (12) (3) 对应位乘积

新数相加

X = 1 + 0 + 8 + 0 + 0 + 45 + 32 + 21 + 12 + 3

X = 122

计算模数

M = X % 10 = 122 % 10 = 2

计算校验码

Check_Code = 10 - M = 10 - 2 = 8

编号正确。


4、代码,字母 速算 法:

令字母表:ABCDEFGHJKLMNPQRSTUVXYWZIO

顺序编号:12345678....

则相应的代码 = 字母表编号 + 9 .

例如,C , 3 + 9 = 12 ,查 表一 正确。


5、C 编码:

bool
_stdcall
TaiWanUserID(
   char *s
)
{
 char *List="ABCDEFGHJKLMNPQRSTUVXYWZIO";
 char *p;
 int x;

 //入口检查
 if ( strlen(s)!=10 )
 {
  return false;
 }
 p=strchr(List,toupper(*s));

 if (p==NULL)
 {
  return false;
 }

 x=(int)(p-List);
 x=x %10 *9 + x/10;

 p=s+1;

 if ( *p !='1' && *p != '2')
 {
  return false;
 }

 for (int i=1;i<9;i++)
 {
  if (isdigit(*p))
  {
   x+=(*p++-'0')*(9-i);
  }
  else
  {
   return false;
  }
 }

 x=9 - x%10;

 return ( x==(*p-'0') );

}

 


参考:

張朝植, "身分證字號識別碼辨認之巨集設計", 倚天雜誌, DEC.1993, p156

本文地址:http://com.8s8s.com/it/it29478.htm