Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@twlca
Created October 14, 2016 06:15
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save twlca/05fe7732a935e2e0937e3aafce8d8a02 to your computer and use it in GitHub Desktop.
Save twlca/05fe7732a935e2e0937e3aafce8d8a02 to your computer and use it in GitHub Desktop.
檢查身分證字號
/* 依據內政部:
1. 身分證編碼原則
2. 外來人口統一證號編碼原則(居留證) https://www.immigration.gov.tw/ct_cert.asp?xItem=1106801&ctNode=32601&mp=1
身分證及居留證通用
第一碼 縣市編碼原則:
A=10 台北市 J=18 新竹縣 S=26 高雄縣
B=11 台中市 K=19 苗栗縣 T=27 屏東縣
C=12 基隆市 L=20 台中縣 U=28 花蓮縣
D=13 台南市 M=21 南投縣 V=29 台東縣
E=14 高雄市 N=22 彰化縣 W=32 金門縣
F=15 台北縣 O=35 新竹市 X=30 澎湖縣
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山
H=17 桃園縣 Q=24 嘉義縣 Z=33 連江縣
I=34 嘉義市 R=25 台南縣
第二碼
身分證: 1 男姓 2 女生
居留證:
臺灣地區無戶籍國民、大陸地區人民、港澳居民:
A 男性 B 女性
外國人:
C 男性 D 女性
第三碼
身分證: 目前均為 0
居留證: 1 男性 2 女性
其餘 4~9 碼均為數字 0...9
最末碼 檢核碼
檢核碼為根據前九碼編碼加權後之計算產生,用以核對 (checksum) 字號正確性
檢核碼意義可以參考 http://finalfrank.pixnet.net/blog/post/19639058-身分證字號驗證方法
身分證字號產生器 https://people.debian.org/~paulliu/ROCid.html,可用以檢核程式是否正確
居留證號碼也是利用類似的概念,祇是第二碼英文字依第一碼原則取對照數字,祇取個位數,也就是
A 取 0, B 取 1, C 取 2, D 取 3
以下是身分證檢核 JavaScript 程式函式 */
function checkPid( pid ) {
if ( pid.length !== 10 ) return '身分證字號長度不正確';
if ( !/(^[A-Za-z][12][\d]{8}$)|([A-Za-z][A-Da-d][\d]{8}$/.test(pid)) return '身分證字號含不合法字元,請檢查'; // PREG 驗證
if ( !/^[A-Za-z][\d]{9}$/.test(pid)) { // 此為身分證字號
pid = pid.toUpperCase(); // 即使輸入小寫字元,也將它轉成大寫字元
var codes = '0123456789ABCDEFGHJKLMNPQRSTUVXYWZIO'; // 注意英文字母順序
var pidCodes = {};
$(codes.split('')).each( function( index, elem) {
pidCodes[elem] = index; // 建立字母vs數字對照表
});
// 依據前9碼權重總合與最後檢核碼比較
var sum = 0;
for ( var i=8; i>0; i--) {
sum += parseInt(pidCodes[pid.charAt(i)]) * (9-i);
console.log( sum + '- ' + pid.charAt(i) + '= ' + parseInt(pidCodes[pid.charAt(i)]) * (9-i));
}
var checkDigit = 10 - (sum + parseInt(pidCodes[pid.charAt(0)])%10*9 + parseInt(parseInt(pidCodes[pid.charAt(0)]/10)))%10;
return checkDigit === parseInt(pid.slice(-1)) ? '身分證字號檢核正確' : '身分證字號檢核不正確';
} else {
if (/^[A-Za-z][A-Da-d][\d]{8}$/.test(pid)) { // 此為居留證證號
// 程式內容待補充
}
}
@KnucklesHuang
Copy link

KnucklesHuang commented May 22, 2023

檢查碼是0的時候,會不正確,checkDigit算出來是10不等於0
要加上 checkDigit %= 10; //前9碼權重總合加起來是0的話,算出來是10,要再取個位數才行

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment