跳至主要內容
儀器櫃/網路與生活← J04 · J06 →
J05

台灣格式驗證

身分證、居留證、統一編號與手機號碼的檢查碼驗證。純演算法,不查任何資料庫。

原理

國民身分證、2021 年起的新式統一證號、舊式的兩個英文字母統一證號,三種格式共用同一個加權和。第一個英文字母先依內政部的對照表展開成兩位數,權重分別是 1 與 9;舊式統一證號的第二個字母佔第三個位置,只貢獻它對照值的個位數;其後每一位的權重是 8、7、6…2,最後一位檢查碼權重 1。總和是 10 的倍數就通過。這個設計是刻意的——新式統一證號把第二位改成 8 或 9,讓原本只驗身分證的系統不用改就能接受它。

字母對照表不是按字母順序排的,因為它跟著當年的行政編號:I 是 34、O 是 35,接在 Z 之後,原因是嘉義市與新竹市後來才升格。那個字母記的是「第一次發證的戶政事務所」,不是現在住哪裡,所以看到 L(臺中縣)或 Y(陽明山管理局,1974 年撤銷)這種已經不存在的行政區是正常的。

統一編號用財政部的「邏輯乘法」:每一位乘上權重 1、2、1、2、1、2、4、1,然後把乘積的各位數加起來,所以 7×4=28 貢獻的是 2+8=10 而不是 28。這裡有兩件事會讓人踩到。第一,2023 年 4 月 1 日起判定規則從「總和是 10 的倍數」改成「5 的倍數」,因為剩下未發放的號碼沒辦法全部滿足較嚴的規則;2023 年之前發的號碼兩種規則都過,所以還在用舊規則的系統只會退掉新號碼,那正是最難找的那種 bug。第二,第七位是 7 的時候,官方規則允許總和照算或加一,所以那種號碼有兩個可接受的總和——這不是實作寫錯。兩種判定這裡都會列出來。

手機號碼沒有檢查碼。台灣的 09 開頭號碼是純號碼,沒有任何可以驗算的東西,所以這裡驗的只有格式:09 加八位數字,並把 +886 折回本地寫法。哪些 09xx 號段真的發給了業者是 NCC 的配號表,會變,而且號碼可以跨業者攜出,所以這個工具刻意不假裝知道。市話的區碼表倒是有位數可以核對,但號碼計畫本身會改——臺北市 2000 年就從 7 碼變成 8 碼——所以那張表在畫面上可以編輯。

界線

  • 檢查碼只能證明號碼「編得對」。編得對的號碼不代表有人持有它,不代表那個人是誰,也不代表那家公司還在營業。這一頁不查任何資料庫,也沒有資料庫可以查——要確認統一編號對應的公司,去財政部稅籍登記查詢;要確認身分,那不是一個網頁能做的事。
  • 舊式(兩個英文字母)統一證號的檢查碼規則是照移民署公告的編碼原則實作的,權重配置與計算順序都對得上文件,但沒有公開的合法號碼清單可以逐筆比對,所以那一部分的信心度低於身分證與統一編號——後兩者有公開可驗的已知值。
  • 沒有做的:健保卡號、統一發票號碼、銀行帳號、自然人憑證。前三者沒有公開的檢查碼規則可以實作,硬做出來的「驗證」只會給人錯誤的信心。
  • 整批檢查有筆數上限。輸入的號碼不會被記住、不會被上傳、不寫進瀏覽器儲存空間——關掉分頁就沒了。