## 編號規則

A-Z 男：1

A 1 2 3 4 5 6 7 8 9

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

Index $n_0$ $n_1$ $n_2$ $n_3$ $n_4$ $n_5$ $n_6$ $n_7$ $n_8$ $n_9$ $n_{10}$

$(n_0\times 1+n_1\times 9+n_2\times 8+n_3\times 7+n_4\times 6+n_5\times 5+n_6\times 4+n_7\times 3+n_8\times 2+n_9\times 1+n_{10}\times 1)\%10 = 0$

A123456789 轉換成 10123456789 後套入公式如下:

\begin{aligned} &(1\times 1+0\times 9+1\times 8+2\times 7+3\times 6+4\times 5+5\times 4+6\times 3+7\times 2+8\times 1+9\times 1)\%10 \\ &= (1+0+8+14+18+20+20+18+14+8+9)\%10\\ &= 130\%10\\ &= 0 \end{aligned}

## 程式碼

 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 function verifyId(id) { id = id.trim(); if (id.length != 10) { console.log("Fail，長度不正確"); return false } let countyCode = id.charCodeAt(0); if (countyCode < 65 | countyCode > 90) { console.log("Fail，字首英文代號，縣市不正確"); return false } let genderCode = id.charCodeAt(1); if (genderCode != 49 && genderCode != 50) { console.log("Fail，性別代碼不正確"); return false } let serialCode = id.slice(2) for (let i in serialCode) { let c = serialCode.charCodeAt(i); if (c < 48 | c > 57) { console.log("Fail，數字區出現非數字字元"); return false } } let conver = "ABCDEFGHJKLMNPQRSTUVXYWZIO" let weights = [1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1] id = String(conver.indexOf(id[0]) + 10) + id.slice(1); checkSum = 0 for (let i = 0; i < id.length; i++) { c = parseInt(id[i]) w = weights[i] checkSum += c * w } verification = checkSum % 10 == 0 if (verification) { console.log("Pass"); } else { console.log("Fail，檢核碼錯誤"); } return verification } console.log(verifyId("A123456789")); 

 1234567891011121314151617181920212223242526 function verifyId(id) { id = id.trim(); verification = id.match("^[A-Z][12]\\d{8}\$") if(!verification){ return false } let conver = "ABCDEFGHJKLMNPQRSTUVXYWZIO" let weights = [1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1] id = String(conver.indexOf(id[0]) + 10) + id.slice(1); checkSum = 0 for (let i = 0; i < id.length; i++) { c = parseInt(id[i]) w = weights[i] checkSum += c * w } return checkSum % 10 == 0 } console.log(verifyId("A123456789")); 

## 進一步驗證規則

1. 性別
當然就是檢查第二碼來確認啦。

2. 縣市代碼與戶籍地的對照：
不過這個用到的機會不大，鮮少有情境是輸入戶籍地，多數時候都是輸入通訊地 XD

3. 縣市代碼與出生日期的比較：
因為縣市合併的關係，目前有部份縣市代碼已不再賦配。所以可以比較出生日期與停發日期做進一步檢查。

縣市代碼 原行政區 停發日期
L 臺中縣 2010/12/25
R 臺南縣 2010/12/25
S 高雄縣 2010/12/25
Y 陽明山管理局 1974/01/01

## 參考資料

1. 林姸君 (2020-07-10)。身分證A123456789真有人　一條龍伯「信用破產」冤跑法庭：別再害我了 。檢自 ctwant (2020-07-10)。
2. (2006-02-17)。身分證「A123456789」老被冒用 。檢自 ctwant阿特拉斯的部落格 (2020-07-10)。
3. 協同撰寫。中華民國國民身分證。檢自 維基百科 (2020-07-10)。

## 更新紀錄

• 2021-03-10 更新：新增身分碼資料
• 2020-08-25 更新：新增 Regular expression
•
• 2020-08-10 發布
•
• 2020-07-13 完稿
•
• 2020-07-10 起稿