工程師必知!設計表單時,該如何處理身分證字號及居留證統一證號?如何設計驗證規則?

高可慶
·
·
IPFS
·
台灣主要身分證件有身分證、居留證及護照等。台灣作為多元族群的社會,如果表單涉及到使用者的身分資料,應充分考量不同身分民眾的使用情境。否則邏輯錯誤的表單,恐損害部份民眾的權益。

購物網站、APP 或顧客管理系統等,通常都會需要讓使用者輸入身分資料,例如姓名、身分證字號、性別、地址、聯絡電話等。

台灣作為多元族群的社會,來自不同國家、不同身分的人共同生活在台灣。這些人自然也會有使用各項服務的需求。如果表單會涉及到使用者的身分資料,應該充分考量不同身分民眾的權益及使用者經驗。否則可能會因為使用者持不同的證件,而無法順利使用該服務。

作為軟體工程師或程式設計師,瞭解台灣的身分制度,以及證件類型是相當重要的。本文以 PHP 為例,說明處理身分證字號及居留證統一證號時,必須要留意的地方。

居留證持證人有哪些?

本國人的身分證件有國民身分證,而外國人則有居留證,這點應該許多人都知道。不過,你知道居留證持證人不只是外國人嗎?

所謂「中華民國居留證」的持證人,主要包含外國人、大陸港澳居民以及中華民國無戶籍國民。而中華民國無戶籍國民,顧名思義就是沒有戶籍的本國國民。所以並不是所有拿居留證的人,都是外國人

也就是說,本國人的證件可能包含:

  • 國民身分證

  • 中華民國居留證

  • 中華民國護照

外國人及大陸港澳居民的證件可能包含:

  • 中華民國居留證

  • 該國籍國核發的護照

新式統一證號

居留證統一證號,相當於身分證字號,2021 年 1 月 2 日起移民署推出新式統一證號之後,採用與身分證字號相同的格式。所謂相同的格式,是指,除了第 1 碼為英文字母之外,其餘 9 碼皆為數字,而驗證規則和身分證字號相同。因此,可以直接沿用身分證字號的驗證規則。

不過,必須特別留意的是,新式統一證號的性別碼和身分證字號不同。新式統一證號的性別碼如下:

  • 8:男性

  • 9:女性

另外,第 3 碼的部份則為身分代碼:

  • 0 - 6:外國人或無國籍人

  • 7:無戶籍國民

  • 8:香港居民及澳門居民

  • 9:大陸地區居民

因此,如果要判斷居留證持證人的身分,可以透過第 3 碼來判斷。不過,外國人的部份,無法透過統一證號得知持證人的國籍。

由於新式統一證號的驗證規則本身和身分證字號相同,網路上已有許多範例可以看,所以這篇就不打算討論驗證規則的部份。

舊式統一證號

目前移民署已不再核發載有舊式統一證號的居留證,只要因延期、居留原因變更、資料異動等原因換發居留證時,即核發載有新式統一證號的居留證。

除外國特定專業人才的居留期限最長 5 年,以及永久居留者無居留期限之外,一般外國人的居留期限最長為 3 年。2021 年 1 月 2 日起移民署開始核發新式統一證號之後,已經超過三年,目前仍持載有舊式統一證號的居留證者,應大幅減少。不過,仍建議於驗證程式中,加入舊式統一證號的規則,以免部份民眾輸入舊式統一證號時無法通過驗證。

至於舊式統一證號的格式及驗證規則,網路上都有範例可以看,所以這篇就不再額外做說明。

性別之判斷

我看網路上的範例,通常會用這樣的正規表示式,來初步檢查身分證格式:

^[A-Z][12]\\d{8}$

結果,一旦有人輸入統一證號,必定無法通過驗證

錯誤範例:

圖片取自「易遊網」官網。輸入統一證號時,顯示「第二碼必須為1或2」

而若使用情境中,要輸入性別的情況,通常也會透過性別碼來檢查性別是否填錯。以 PHP 為例,可以用這樣的程式碼來判斷使用者的性別:

$gender = substr($idnum, 1, 1);
if($gender == '1' ){
      echo '男性';
}
else if($gender == '2' ){
      echo '女性';
}
else{
      echo '性別碼錯誤';
}

不過,這樣的表單,顯然不符合營造多元身分友善社會的趨勢。那麼,該如何解決?

身分證與居留證共用相同表單

若使用情境中,沒有要排除居留證持證人,而共用相同的表單,則上述正規表示式可以改為:

^[A-Z][1289A-D]\\d{8}$

而判斷性別的部份,可以像這樣:

$gender = substr($idnum, 1, 1);
if($gender =='1' || $gender =='8' || $gender =='A' || $gender =='C'){
      echo '男性';
}
else if($gender =='2' && $gender =='9' || $gender =='B' || $gender =='D' ){
      echo '女性';
}
else{
      echo '性別碼錯誤';
}

這樣的使用情境中,欄位名稱建議使用「身分證字號 / 統一證號」,以免讓使用者誤以為只能輸入身分證字號。範例:

欄位範例

使用者身分之辨認

由於居留證及身分證核發單位不同,實務上如果因身分認證的需求而進一步要向主管機關核對身分資料的話,可能還要將居留證及身分證分開處理。且居留證與身分證上的欄位也有所不同。

若使用情境中,希望以證件區分使用者的身分,你可能會想到以國籍來判斷使用者持何種證件,這樣似乎更簡而易懂。例如,點選本國人時,讓使用者輸入身分證字號,而點選外國人時,讓使用者輸入居留證統一證號。

不過,如上所述,居留證的持證人也有可能是本國人,卻只能在點選「外國人」時,才能填寫居留證統一證號,這樣的表單設計,顯然是有問題的

錯誤範例:

圖片取自「富邦產險」官網。點選「本國人」並輸入統一證號時,顯示「請輸入有效的身分證號」。
圖片取自「EZ WAY易利委」APP。點選「非中華民國」時才能以居留證進行註冊。

這些表單,點選「本國人」或「中華民國」時,只能填寫身分證字號,而點選外國人時,只能填寫居留證統一證號,讓無戶籍國民無所適從。也沒有任何文字說明,表示無戶籍國民必須點選「外國人」或「非中華民國」。可以說,這樣的表單對無戶籍國民來說,毫無使用者體驗可言。

以證件區分使用者身分

這種情境中,最好將「國籍欄」改為「證件類型」,並讓使用者選擇「國民身分證」或「中華民國居留證」。畢竟使用者必然會知道自己所持的證件是什麼,因此這樣的表單更不容易有填錯的機會。

正確範例:

圖片取自「新北市政府警察局交通違規檢舉系統」網站

再搭配格式驗證程式,點選身分證時,只能填寫第 2 碼為 1 或 2 的身分證字號,而點選居留證時,只能填寫第 2 碼為 8 或 9 以及 A - D 的統一證號。

不過,這個範例有一個問題。其實「居留證號碼」並不是正確的名稱。由於移民署核發給無戶籍國民及港澳居民的「臺灣地區居留證」,會有「居留證號」及「統一證號」兩個欄位,因此,設計表單時,建議一律使用「居留證統一證號」或簡寫為「統一證號」,以免混淆使用者。

自動辨別使用者身分

由於身分證字號的第 2 碼,必然為 1 或 2,新式統一證號的第 2 碼,則必然為 8 或 9,而舊式統一證號的第 2 碼,必然為 A、B、C 或 D,因此我們也可以透過第 2 碼來辨別使用者輸入的證件類型:

$gender = substr($idnum, 1, 1);
if($gender == '1' || $gender == '2'){
      echo '國民身分證';
}
else if($gender =='8' || $gender =='9'){
      echo '中華民國居留證(新式統一證號)';
}
else if($gender =='A' || $gender =='B' || $gender =='C' || $gender =='D'){
      echo '中華民國居留證(舊式統一證號)';
}

如此一來,不需要讓使用者點選證件類型,使用上更加的簡單。當然,如果要進一步辨別身分,可以像這樣:

$gender = substr($idnum, 1, 1);//取第2碼
//身分證字號
if($gender == '1' || $gender == '2'){
      echo '有戶籍國民';
}
//新式統一證號
else if($gender == '8' || $gender == '9'){
      $type = substr($idnum, 2, 1);//取第3碼
      if($type >= 0  && $type <= 6) {
            echo '外國人';
      }
      else if($type == "7") {
            echo '無戶籍國民';
      }
      else if($type == "8") {
            echo '香港居民及澳門居民';
      }
      else if($type == "9") {
            echo '大陸地區居民';
      }
}
//舊式統一證號
else if($gender == 'A' || $gender == 'B'){
      echo '無戶籍國民、香港居民、澳門居民或大陸地區居民';
}
else if($gender == 'C' || $gender == 'D'){
      echo '外國人';
}

要留意的是,舊式統一證號只能辨認「外國人」或「無戶籍國民、香港居民、澳門居民或大陸地區居民」兩種身分。

以國籍區分使用者身分

若一定要讓使用者點選「國籍」,則必須在點選本國人時,除了身分證字號之外,允許使用者輸入第 3 碼(身分碼)為 7 的統一證號。

$gender = substr($idnum, 1, 1);
if($gender =='1' || $gender =='2'){
      echo '本國籍(有戶籍)';
}
else if($gender == '8' || $gender == '9'){
      $type = substr($idnum, 2, 1);
      if($type == "7") {
            echo '本國籍(無戶籍)';
      }
}

不過有一個問題是,舊式統一證號無法辨認「無戶籍國民」,因此透過「身分證字號」及「統一證號」來辨認「國籍」,可能不實際。

護照之處理

中華民國(臺灣)護照,根據持照人的設籍情形,欄位的部份會有所不同。

有戶籍國民(有身分證者),護照個人資料頁會有「身分證統一編號」欄,而無戶籍國民(無身分證者)則沒有「身分證統一編號」欄。

因此,在必須處理本國人護照的情境,身分證字號(身分證統一編號)欄不可設計為必填

錯誤範例:

圖片取自「中華航空華夏會員」註冊頁面。點選「台灣」時,身分證字號為必填。

像這個表單,當「國籍 / 地區」點選「台灣」時,身分證字號欄為必填。且身分證字號欄的驗證規則未納入居留證統一證號。如此一來,無戶籍國民無從進行註冊。而當「國籍 / 地區」選擇其他國家時,身分證字號欄則會消失。

事實上,無戶籍國民的護照上沒有身分證字號欄,甚至多數無戶籍國民可能連統一證號都沒有。這樣的表單,排除了所有無戶籍國民,對無戶籍國民極為不友善。

正確的作法應該是,身分證字號欄不應設計為必填。如果要限定居住在台灣的無戶籍國民,身分證字號欄的驗證規則加入第 3 碼(身分碼)為 7 的統一證號,並將「身分證字號」欄位改為「身分證字號 / 統一證號」。

總結

處理身分資料時,除了要確保個資安全之外,也須充分考量不同身分者的使用情境。若未妥善設計表單,可能無意間損害部份民眾的權益,進而影響使用者對該服務的評價。尤其國籍的處理,會涉及到使用者的身分認同,更要謹慎處理。就如同上面的例子,不允許無戶籍國民點選「中華民國」或「台灣」,等同於服務提供方否定了使用者的國籍,這種情形實在不應該發生。

參考資料

維基百科「中華民國居留證

CC BY-NC-ND 4.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!

高可慶身為新臺灣人,長期以來關注無戶籍國民、以及外國人的權益,並致力於改善其在臺灣的權益。在這裡也希望透過介紹無戶籍國民或外國人相關法規,來讓大家瞭解不合理之處。
  • 选集
  • 来自作者
  • 相关推荐