如何 驗證 正確 的 身分 證 字號

�ˬd�����Ҧr��


�����Ҧr���G

���إ��ꪺ�����Ҧr������S�w���s�X��h�C�Ĥ@�Ӧr�O�j�g���^��r���A��l9�Ӧr�������Ʀr�A ���b�M�νs�X��h�ɡA�Ĥ@�ӭ^��r���N�|���̤U���Q�ഫ���Ʀr�G

�r�� A B C D E F G H J K L M N
�Ʀr 10 11 12 13 14 15 16 17 18 19 20 21 22
�r�� P Q R S T U V X Y W Z I O
�Ʀr 23 24 25 26 27 28 29 30 31 32 33 34 35

�ഫ�᪺�����Ҧr��(�@11��Ʀr)�C�@��Ƨ����T�w���v��(Weight)�A�ѥ����k�̧Ǭ� �y1 9 8 7 6 5 4 3 2 1 1�z�C�P�_�����Ҧr���O�_���T����k���G �U��Ʀr�P��۹������v���ۭ���A�[�`�A�[�`�᪺���G�Y��10�����ƫh�����Ҧr���Y�ݥ��T�C

�����Ҧr���W�h

�����Ҧr�����C�Ӧr���N�����N�q�p�U�G A123456789

(1) �Ĥ@�Ӧr���N���a�ϡA�ഫ�覡���G A �ഫ�� 1,0 ��Ӧr���A B �ഫ�� 1,1�K�K

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

10

11

12

13

14

15

16

17

34

18

19

20

21

22

35

23

24

25

26

27

28

29

32

30

31

33

(2) �ĤG�Ӧr���N���ʧO�A 1 �N���k�ʡA 2 �N���k��

(3) �ĤT�Ӧr����ĤE�Ӧr�����y�����X�C

(4) �ĤQ�Ӧr�����ˬd���X�C

�ˬd�X���ͪ��W�h���G

1.

�C�Ӭ۹����Ʀr���W�v��

�ˬd���X

A

1

2

3

4

5

6

7

8

9

1

0

x8

x7

x6

x5

x4

x3

x2

x1

x1

X9

2. �N���W�v�ƫᤧ�n�ۥ[

1 x 1 = 1

0 x 9 = 0

1 x 8 = 8

2 x 7 = 1 4

3 x 6 = 1 8

4 x 5 = 2 0

5 x 4 = 2 0

6 x 3 = 1 8

7 x 2 = 1 4

+) 8 x 1 = 8

------------------------------------------------

1 2 1

3. �ۥ[�ᤧ�Ȱ��H�Ҽ� 10 ����l��

1 2 1 / 1 0 = 12 �E�E�E�l�� 1

4. �ѼҼƴ�h�l�Ʊo�ˬd���X�A�Y�l�Ƭ� 0 �ɡA�h�]�w���ˬd�X�� 0

10 �V 1 = 9

檢查身分證字號

這篇文章會介紹使用 Python 的字典、串列、for 迴圈、random 和 if 判斷式,做出一個身分證字號產生器。

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

基本原理

按照身分證字號編碼規則,輸入身分證字號後,先判斷是否有「十碼」,接著判斷第二碼是否為 1 或 2,最後判斷檢查碼,當三層判斷都是 True 時,表示身分證字號正確。

參考:身分證字號編碼規則

如何 驗證 正確 的 身分 證 字號

檢查身份字號

檢查身分證字號的流程如下:

  • 新增一個 local_table 變數,內容是第一碼英文數字的對照表,再新增一個變數 id_number 記錄使用者輸入的身分證字號。
  • 新增 check 變數為 False,和 while 迴圈搭配,待會在 while 迴圈的最後方會加入 check=True,如果執行到一半跳出 ( 身分證字號錯誤 ),check 就會是 False。
  • 將英文字對應的兩位數的數字,記錄到 check_arr 變數變成兩個項目 ( 記錄為數字 ),作為最後檢查碼的判斷使用。
  • 新增 sex 變數,內容是身分證字號的第二碼,判斷如果不是字串 1 也不是字串 2 ( 因為第二碼不是 1 就是 2 ),就跳出 while 迴圈。
  • 最後套用第十碼檢查碼的程式,計算檢查碼是否相同,如果不相同,就跳出 while 迴圈,如果相同,最後加上 check=True,表示檢查完全正確,迴圈結束後,根據 check 的 True 或 False,印出對應的結果。

參考:input、while、if 判斷式、break、list、讀取串列項目、for 迴圈、append 添加串列項目

local_table = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':34,
        'J':18,'K':19,'L':20,'M':21,'N':22,'O':35,'P':23,'Q':24,'R':25,
        'S':26,'T':27,'U':28,'V':29,'W':32,'X':30,'Y':31,'Z':33}
id_number = input('輸入身分證字號:')
check = False                         # 新增 check=False 變數,與 while 迴圈搭配
while True:                           # 使用 while 迴圈
    id_arr = list(id_number)            # 新增 id_arr 變數,將身分證字號轉換成串列存入
    if len(id_arr)!=10: break           # 判斷如果 id_arr 長度不等於 10,就跳出 while 迴圈
    local = str(local_table[id_arr[0]])    # 將對應的二位數字轉換成字串
    check_arr = list(local)                # 將字串轉換成陣列,例如 '10' 會轉換成 ['1','0']
    check_arr[0] = int(check_arr[0])       # 將串列中的第一個項目轉換成數字
    check_arr[1] = int(check_arr[1]) * 9   # 將串列中的第二個項目轉換成數字
    sex = id_arr[1]                   # 取得第二碼數字
    if sex!='1' and sex!='2': break   # 判斷如果不是 '1' 也不是 '2' 就跳出 while 迴圈
    check_arr.append(int(sex)*8)                 # 將 sex 內容轉換成數字並乘以 8,存入 check_arr 裡
    for i in range(7):                           # 使用 for 迴圈,重複七次
        check_arr.append(int(id_arr[i+2])*(7-i))   # 每次重複,按照檢查碼程式,將數字乘以對應的數值
    check_num = 10 - sum(check_arr)%10           # 計算使用者輸入的檢查碼
    if check_num != int(id_arr[9]): break        # 如果檢查碼不相同,跳出 while 迴圈
    check = True                                 # 如果迴圈都沒有跳出,讓 check 等於 True。
    break                                        # 結束後跳出迴圈

if check == False:                             # while 迴圈結束後,如果 check 等於 Fasle,表示身分證字號錯誤
    print('身分證字號格式錯誤')
else:
    print('身分證字號正確')

加上錯誤判斷流程

雖然上述的程式已經可以檢查身分證字號,但如果使用者輸入一串奇怪的文字,例如 xyz,可能就會發生錯誤而導致程式無法運作,這時可以加入 try 和 except 做檢查和保護,如果遇到例外的狀況,就直接跳出 while 迴圈。

參考:例外處理 ( try、except )

local_table = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':34,
        'J':18,'K':19,'L':20,'M':21,'N':22,'O':35,'P':23,'Q':24,'R':25,
        'S':26,'T':27,'U':28,'V':29,'W':32,'X':30,'Y':31,'Z':33}
while True:       # 新增 while 迴圈,就可以重複輸入
    id_number = input('輸入身分證字號:')
    check = False
    while True:
        try:          # 使用 try
            id_arr = list(id_number)
            if len(id_arr)!=10: break
            local = str(local_table[id_arr[0]])
            check_arr = list(local)
            check_arr[0] = int(check_arr[0])
            check_arr[1] = int(check_arr[1]) * 9
            sex = id_arr[1]
            if sex!='1' and sex!='2': break
            check_arr.append(int(sex)*8)
            for i in range(7):
                check_arr.append(int(id_arr[i+2])*(7-i))
            check_num = 10 - sum(check_arr)%10
            if check_num != int(id_arr[9]): break
            check = True
            break
        except:      # 使用 except,如果發生例外狀況,跳出迴圈
            break

    if check == False:
        print('身分證字號格式錯誤')
    else:
        print('身分證字號正確')

如何 驗證 正確 的 身分 證 字號

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~