--- title: "ID驗證系列|居留證驗證號" date: 2021-09-02 22:12 is_modified: false disqus: cynthiahackmd categories: - "先備知識" tags: - "編碼規則" - "Javascript" - "regexp" - "臺灣ID驗證系列" - "Published" --- {%hackmd @CynthiaChuang/Github-Page-Theme %} <br> 這是這個系列中的最後一篇,最後就來看看居留證的驗證。 <!--more--> <p class="illustration"> <img src="https://i.imgur.com/rqlFFMq.png" alt="居留證樣本"> 居留證樣本(圖片來源: <a href="https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%B1%85%E7%95%99%E8%AD%89#%E5%A4%96%E4%BE%86%E4%BA%BA%E5%8F%A3%E7%B5%B1%E4%B8%80%E8%AD%89%E8%99%9F%E7%B7%A8%E7%A2%BC%E5%8E%9F%E5%89%87" >維基百科</a>) </p> ## 編碼規則 居留證編碼比較麻煩是目前有==兩版==的規則。在今年 2021 年的 1 月 2 日開始換發,新版「外來人口統一證號」會比照國民身分證字號編碼改版,不過為了降低能量針對藍領居留之移工是採屆期換發,因此未來可能有段時間會是兩套編碼規則並行的。 <p class="illustration"> <img src="https://i.imgur.com/1Moj5yd.jpg?1" alt="新版「外來人口統一證號」比照國民身分證字號編碼改版"> 新版「外來人口統一證號」比照國民身分證字號編碼改版(圖片來源: <a href="https://www.cna.com.tw/news/ahel/202101020034.aspx">中央社 CNA</a>) </p> 因此,我們也分成兩部份來討論: ### 舊版規則 編碼的方式與身分證字號類似,居留證編碼一樣有 **10 碼**,一樣可以將其分成四區:**區域碼**、**性別代碼**、**流水碼** 跟 **檢核碼**。 <table> <tbody> <tr> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th>9</th> <th>10</th> </tr> <tr> <th>區域碼</th> <th>性別碼</th> <th colspan="7">流水碼</th> <th>檢核碼</th> </tr> <tr> <td>A-Z</td> <td>無戶籍國民與中港澳地區人民: 男:A / 女:B<br> 外國人: 男:C / 女:D </td> <td colspan="7">阿拉伯數字 </td> <td>阿拉伯數字</td> </tr> </tbody> </table> 身分證字號與居留證編碼,兩種編碼最大的差異在於第二碼的**性別代碼**。與身份證用 1、2 分別表示男女性不同,舊版居留證的性別碼依照人民來源與性別來賦予一個==英文代號==。 <br> 整體來說,一個完整的居留證編碼如下: <table> <tbody> <tr> <th>區域碼</th> <th>性別碼</th> <th colspan="7">流水碼</th> <th>檢核碼</th> </tr> <tr> <td>F </td> <td>A </td> <td>1 </td> <td>2 </td> <td>3 </td> <td>4 </td> <td>5 </td> <td>6 </td> <td>8 </td> <td>9 </td> </tr> </tbody> </table> <br> 在進行編碼檢查時,一樣需將首碼的區域碼換成相對應的數值,其轉換表格與身分證相同,如 F 就會被轉換成 `15`。 |A|B|C|D|E|F|G|H|I|J| |---|---|---|---|---|---|---|---|---|---| |10|11|12|13|14|15|16|17|34|18| |K|L|M|N|O|P|Q|R|S|T| |---|---|---|---|---|---|---|---|---|---| |19|20|21|22|35|23|24|25|26|27| |U|V|W|X|Y|Z| |---|---|---|---|---|---| |28|29|32|30|31|33| 而次碼的性別碼,也是需要依照上表將其轉成二位數字後,只取其**個位數**,如 A 就會被轉換成 `0`。 <br> 將轉換完成的數值,乘上相對應的權重後進行加總: |Index|$n_0$|$n_1$|$n_2$|$n_3$|$n_4$|$n_5$|$n_6$|$n_7$|$n_8$|$n_9$|$n_{10}$| |---|---|---|---|---|---|---|---|---|---|---|---| |權重|1|9|8|7|6|5|4|3|2|1|1| 若總和為 **10 的倍數**,即為有效的驗證碼。 <br> 詳細的計算步驟跟[身分證字號的驗證](/@CynthiaChuang/CheckUID)方式相同,這邊就不再算一次了。 ### 新版規則 舊版的規則雖然與身分證字號類似,但格式還是有差異,導致在進行網路購物、訂票、醫療掛號時,會遇到證號格式不同帶來的困擾。為解決這困擾,相關機構決定統一格式,將新版居留證號比照身分證字號編碼。 <table> <tbody> <tr> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th>9</th> <th>10</th> </tr> <tr> <th>區域碼</th> <th>性別碼</th> <th>身分碼</th> <th colspan="6">流水碼 </th> <th>檢核碼</th> </tr> <tr> <td>A-Z</td> <td>男:8<br> 女:9</td> <td>外國人與無國籍人士:0-6<br> 無戶籍國民:7<br> 港澳居民:8<br> 大陸地區人民:9 </td> <td colspan="6">阿拉伯數字 </td> <td>阿拉伯數字</td> </tr> </tbody> </table> <br> 除用 8、9 分別表示男女外,其他的轉換方式跟[身分證字號的驗證](/@CynthiaChuang/CheckUID)方式相同。 ## 程式碼 新版的驗證規則跟身分證字號的驗證一模一樣,所以我就不寫了,只寫舊版的規則。 ```javascript= function verifyId(id) { id = id.trim(); <!-- 在 js 中遇到反斜線要跳脫,所以這邊用兩個反斜線 --> <!-- 如果你看到四個反斜線,那是我為了讓 NexT.Mist 主題順利渲染所再做跳脫 --> verification = id.match("^[A-Z][ABCD]\\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) + String((conver.indexOf(id[1]) + 10)%10) + id.slice(2); 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("FA12345689")); ``` ## 參考資料 1. 梁珮綺 (2021-01-03)。[新版外來人口統一證號2日起換發 外國人生活更便利](https://www.cna.com.tw/news/ahel/202101020034.aspx)。檢自 中央社 CNA (2021-03-11)。 2. 協同撰寫。[外來人口統一證號編碼原則](https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%B1%85%E7%95%99%E8%AD%89#%E5%A4%96%E4%BE%86%E4%BA%BA%E5%8F%A3%E7%B5%B1%E4%B8%80%E8%AD%89%E8%99%9F%E7%B7%A8%E7%A2%BC%E5%8E%9F%E5%89%87)。檢自 維基百科 (2021-03-11)。 3. gomumu (2006-11-29)。[[知識+]外籍人士用的統一證號編碼規則](https://gomumu.pixnet.net/blog/post/3128951-%5B%E7%9F%A5%E8%AD%98%2B%5D%E5%A4%96%E7%B1%8D%E4%BA%BA%E5%A3%AB%E7%94%A8%E7%9A%84%E7%B5%B1%E4%B8%80%E8%AD%89%E8%99%9F%E7%B7%A8%E7%A2%BC%E8%A6%8F%E5%89%87)。檢自 痞客邦(2021-03-10)。 4. 內政部 (2019-10)。[「外來人口統一證號格式專案」修正計畫(核定本)](http://www.academic.fcu.edu.tw/wSite/public/Attachment/f1582594331972.pdf)。檢自 內政部 (2021-03-10)。 ## 更新紀錄 :::spoiler 最後更新日期:2021-09-02 - 2021-09-02 發布 - 2021-03-11 完稿 - 2021-03-10 起稿 ::: {%hackmd @CynthiaChuang/Github-Page-Footer %}