中華民國的「身份證字號」,正式名稱為「國民身分證統一編號」,是由一個代表首次戶籍地的大寫英文字母加上九個數字所組成。雖然《戶籍法》第五十七條第一項規定「年滿十四歲者,應申請初領國民身分證;未滿十四歲者,得申請發給」,但國民就算沒有國民身份證,在出生之後報戶口就會有身份證字號了。當然,台灣不是只有本地國民而已,也存在著他國國籍的人,這類人所使用的相關編號,為了能夠方便在現有的系統中使用,已於西元2021年實施「新式外來人口統一證號」,格式基本與國民使用的身份證字號一致。



格式解析

身分證統一編號/外來人口統一證號的格式如下圖:

tw-id-num

地區

地區以大寫英文字母表示,每個地區都會對應到一個數值,數值用來做校驗計算。身分證統一編號的地區是該人首次入戶籍的地區,外來人口統一證號的地區則是申請地區。

以下是地區的大寫英文字母對照表。

字母 數值 縣市 備註
A 10 臺北市
B 11 臺中市
C 12 基隆市
D 13 臺南市
E 14 高雄市
F 15 新北市
G 16 宜蘭縣
H 17 桃園市
I 34 嘉義市
J 18 新竹縣
K 19 苗栗縣
L 20 臺中縣 已於2010年12月25日停止賦配
M 21 南投縣
N 22 彰化縣
O 35 新竹市
P 23 雲林縣
Q 24 嘉義縣
R 25 臺南縣 已於2010年12月25日停止賦配
S 26 高雄縣 已於2010年12月25日停止賦配
T 27 屏東縣
U 28 花蓮縣
V 29 臺東縣
W 32 金門縣
X 30 澎湖縣
Y 31 陽明山管理局 已於1974年1月1日停止賦配
Z 33 連江縣
性別

身分證統一編號:

  • 1:男
  • 2:女

外來人口統一證號:

  • 7:男
  • 8:女
檢查碼

檢查碼的用途是為了將身分證統一編號/外來人口統一證號的每個字元做特殊運算之後得到的數值能夠符合某個規則,避免不小心填寫錯誤。

檢查的方式如下:

1. 將地區的英文對應到兩位數的數值,取代掉原先的英文,此時會得到11位數字

例如,A12345678910123456789

2. 然後再把每一個數字依序乘上1、9、8、7、6、5、4、3、2、1、1,再進行加總。

例如,10123456789,計算方式如下:

#{{{
\begin{eqnarray}
&& (1 \times 1 + 0 \times 9) \nonumber \\
&+& (1 \times 8 + 2 \times 7 + 3 \times 6 + 4 \times 5 \nonumber \\
& & + 5 \times 4 + 6 \times 3 + 7 \times 2 + 8 \times 1) \nonumber \\
&+& 9 \times 1 \nonumber \\
&=& 130
\end{eqnarray}
}}}#
3. 將加總的數值除以10,若能整除,表示這個身分證統一編號/外來人口統一證號能通過檢查碼驗證。

注意,通過檢查碼驗證並不表示這個身分證統一編號/外來人口統一證號是正確的,還得去檢查性別數字是否為1289。外來人口統一證號的地區英文字母也不應有停止賦配的LRSY

此外,不用說大家應該都知道,即便是正確的格式的身分證統一編號/外來人口統一證號,也不能保證真的查有此人,也就是會有空號啦。這些檢查只是快速過濾資料輸入的失誤而已。

檢查方式的優化

由於地區的大寫英文字母所對應的數值是不連續的,通常會建對應表來處理,且對應的數值會被拆成分開的兩位數來分別乘上1和乘上9。因此其實我們可以直接讓大寫英文字母所對應的兩位數數值是分別乘上1和乘上9再相加之後的結果,就可以少做兩次乘法和一次加法。

TW ID Num

「TW ID Num」是筆者開發的套件,可以檢查或是產生身分證統一編號/外來人口統一證號。

Rust 上使用 TW ID Num

Crates.io

https://crates.io/crates/tw-id-num

Cargo.toml

tw-id-num = "*"
使用方法

tw_id_num這個crate提供checkcheck_nationalcheck_resident三個函數來檢查身分證統一編號/外來人口統一證號。

let id = tw_id_num::generate_national(Some(tw_id_num::Sex::Male)); // e.g. "A123456789"

assert!(tw_id_num::check(&id));
assert!(tw_id_num::check_national(&id));
assert!(!tw_id_num::check_resident(&id));

預設並不會提供產生身分證統一編號/外來人口統一證號的generate*函數,要啟用generate特色才行,但也會讓本來沒有使用到標準函式庫(std)的tw_id_num需要使用標準函式庫。

[dependencies.tw-id-num]
version = "*"
features = ["generate"]

在 JavaScript/TypeScript 上使用 TW ID Num

npm install tw-id-num
import { Mode, check, generate } from "tw-id-num";

const id = generate(Mode.National); // e.g. "A123456789"

console.log(check(id)); // true