台灣地區身分證字號編碼規則
共有十個字元,第1個字元是大寫英文字母,由初次登記的戶籍地決定[2]
第2個字元是數字或大寫英文A-D,分別代表的意義如下[3]
臺灣地區有戶籍國民:男性為1、女性為2
臺灣地區無戶籍國民、大陸地區人民、港澳居民:男性使用A、女性使用B(入出境管理局使用)
外國人:男性使用C、女性使用D(警察局外事科/課使用)
第3~9個字元是數字,共有7位數,有10,000,000組
第3碼依內政部92年4月24日台內戶字第0920063929號函規定[5],自92年7月開始,有關在台無戶籍之外籍、港澳、大陸地區人民及無戶籍國民申請定居時,另行配賦國民身分證統一編號,並以第三碼「6、7、8、9」為區別碼,其區別標準如下:
1、載有「取得國籍日期」者,配賦代碼「6」。
2、載有「海外僑民」者,配賦代碼「7」。
3、載有「港澳居民」者,配賦代碼「8」。
4、載有「大陸地區人民」者,配賦代碼「9」。
無論如何都是數字
第10個字元是數字,檢查碼
檢查碼的演算似乎沒有官方的說明文件,但可參考維基百科上的演算方法;若第二碼非數字者,可參考[4]的說明
PHP的檢查程式
為此我撰寫了一個PHP的檢測身分證字號的程式,他能檢驗是否能符合以上所有規則,回傳真假。相較於其他人寫的程式,我在程式碼上做了優化,並測試了一千萬筆的資料,發現程式速度非常的快,代價就是不易讀。
/** 函數名稱:boolean check_pid(string) * 功能:身分證字號檢查 * 語法:check_pid(身分證字串) * 回傳:符合規則成功回傳true, 否則回傳false **/ function chk_pid($id) { if( !$id )return false; $id = strtoupper(trim($id)); //將英文字母全部轉成大寫,消除前後空白 //檢查第一個字母是否為英文字,第二個字元1 2 A~D 其餘為數字共十碼 $ereg_pattern= "^[A-Z]{1}[12ABCD]{1}[[:digit:]]{8}$"; if(!ereg($ereg_pattern, $id))return false; $wd_str="BAKJHGFEDCNMLVUTSRQPZWYX0000OI"; //關鍵在這行字串 $d1=strpos($wd_str, $id[0])%10; $sum=0; if($id[1]>='A')$id[1]=ord($id[1])-65; //第2碼非數字轉換依[4]說明處理 for($ii=1;$ii<9;$ii++) $sum+= (int)$id[$ii]*(9-$ii); $sum += $d1 + (int)$id[9]; if($sum%10 != 0)return false; return true; }
參考資料
[1] Javascript 的身分證字號檢查程式 http://squall75726.pixnet.net/blog/post/309981516#comment-42707747
[2] 維基百科上身分證 https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%9C%8B%E6%B0%91%E8%BA%AB%E5%88%86%E8%AD%89
[3] 內政部外來人口統一證號編碼原則 https://www.immigration.gov.tw/ct_cert.asp?xItem=1106801&ctNode=32601
[5] http://mlhr.miaoli.gov.tw/law.php?page=21&kind=24