本文介紹如何使用 C# 實作中國大陸居民身份證號碼的驗證邏輯,包含地區碼校驗、出生日期校驗以及最後一位檢驗碼的計算,完整符合 GB11643-1999《公民身份號碼》國家標準。
根據標準,身份證號碼分為 15 位(舊版)與 18 位(新版)兩種格式:
各省、直轄市、自治區及特區的前兩位代碼如下:
| 地區 | 代碼 | 地區 | 代碼 | 地區 | 代碼 |
|---|---|---|---|---|---|
| 北京 | 11 | 吉林 | 22 | 福建 | 35 |
| 廣東 | 44 | 雲南 | 53 | 天津 | 12 |
| 黑龍江 | 23 | 江西 | 36 | 廣西 | 45 |
| 西藏 | 54 | 河北 | 13 | 上海 | 31 |
| 山東 | 37 | 海南 | 46 | 陝西 | 61 |
| 山西 | 14 | 江蘇 | 32 | 河南 | 41 |
| 重慶 | 50 | 甘肅 | 62 | 內蒙古 | 15 |
| 浙江 | 33 | 湖北 | 42 | 四川 | 51 |
| 青海 | 63 | 遼寧 | 21 | 安徽 | 34 |
| 湖南 | 43 | 貴州 | 52 | 寧夏 | 64 |
| 新疆 | 65 | 台灣 | 71 | 香港 | 81 |
| 澳門 | 82 | 國外 | 91 |
7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 進行加權求和S = Σ (Ai × Wi), i = 0..16Y = S mod 11| Y 值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 檢驗碼 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
public static bool ValidateIdCard(string idCard)
{
if (string.IsNullOrEmpty(idCard)) return false;
// 15 位轉 18 位邏輯略...
if (idCard.Length == 18)
{
// 地區碼檢查
string region = idCard.Substring(0, 2);
if (!ValidRegions.Contains(region)) return false;
// 出生日期檢查
if (!DateTime.TryParseExact(idCard.Substring(6, 8), "yyyyMMdd", null, DateTimeStyles.None, out _))
return false;
// 檢驗碼計算
int[] weights = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char[] checkCodes = {'1','0','X','9','8','7','6','5','4','3','2'};
int sum = 0;
for (int i = 0; i < 17; i++)
{
if (!int.TryParse(idCard[i].ToString(), out int digit)) return false;
sum += digit * weights[i];
}
char expected = checkCodes[sum % 11];
return char.ToUpper(idCard[17]) == expected;
}
return false;
}
透過嚴格遵循 GB11643-1999 標準,結合地區碼、日期合法性及檢驗碼演算法,即可可靠驗證中國身份證號碼。實際專案中建議封裝為工具類,並針對 15 位舊版號碼提供自動升級轉換功能。