#!/usr/bin/perl -w # taiwanidchecksum -- 計算台灣國民身分證,居留證字號檢查號碼 # Compute Taiwan citizen and resident identification number checksums # Copyright : http://www.fsf.org/copyleft/gpl.html # Author : 積丹尼 Dan Jidanni Jacobson -- http://jidanni.org/comp/checksums/ # Created On : Sun Jul 11 04:33:18 2004 # Last Modified On: Sat Apr 27 06:45:14 2013 # Update Count : 100 # 輸入:未冠檢號之身碼,一行一碼 # 輸出:有冠檢號之身碼 # Input: letter+number without checksum, one per line # Output: letter+number with checksum. 例 Example: # $ taiwanidchecksum <) { chomp; my $id=$_; # $_=uc; die "非未加檢查碼之身分證或居留證字號 Invalid data: \"$_\"" unless (/^[A-Z][12][0-3]\d{6}$/|| # [12]:[男女] /^[A-Z][ABCD]\d{7}$/); #居留證 s/(.)([ABCD])(.*)/$1 . ((ord $2) - (ord 'A')) . $3/e; #居留證 my $n; switch( substr $_, 0, 1 ) { case 'A' { $n = 10 } #台北市 case 'B' { $n = 11 } #台中市 case 'C' { $n = 12 } #基隆市 case 'D' { $n = 13 } #台南市 case 'E' { $n = 14 } #高雄市 case 'F' { $n = 15 } #前台北縣 case 'G' { $n = 16 } #宜蘭縣 case 'H' { $n = 17 } #桃園縣 case 'I' { $n = 34 } #嘉義市 case 'J' { $n = 18 } #新竹縣 case 'K' { $n = 19 } #苗栗縣 case 'L' { $n = 20 } #前台中縣 case 'M' { $n = 21 } #南投縣 case 'N' { $n = 22 } #彰化縣 case 'O' { $n = 35 } #新竹市 case 'P' { $n = 23 } #雲林縣 case 'Q' { $n = 24 } #嘉義縣 case 'R' { $n = 25 } #前台南縣 case 'S' { $n = 26 } #前高雄縣 case 'T' { $n = 27 } #屏東縣 case 'U' { $n = 28 } #花蓮縣 case 'V' { $n = 29 } #台東縣 case 'W' { $n = 32 } #金門縣 case 'X' { $n = 30 } #澎湖縣 case 'Y' { $n = 31 } #陽明山 case 'Z' { $n = 33 } #連江縣 } my @A = reverse split '', $n . substr $_, 1; my $total = pop @A; my $i = 0; for (@A) { $total += $_ * ++$i } printf "$id%d\n", ( 10 - $total % 10 ) % 10; } # 所有可能身碼總數為 One notes the maximum number of IDs is # print 26 * 2 * 4 * 10 ** 6; #=208,000,000, but # print 26 * 4 ... at least twice as many foreigners?!? # 中國大陸、香港等地採「身份證」人字旁份字。 # 參考如 reference http://zh.wikipedia.org/wiki/中華民國國民身分證