护照资料也下方的两行成为MRZ码(或护照机读码),每行44个字符(0-9,A-Z,<),如下例:
1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 201 2 3 4 5 6 7 8 9 301 2 3 4 5 6 7 8 9 401 2 3 4
P O C H N Z H A N G < < S A N < < < < < < < < < < < < < < < < < < < < < < < < < < < < <
G 4 8 9 4 7 6 4 6 4 C H N 7 3 0 4 2 7 9 M 2 1 0 1 2 6 6 1 9 2 0 3 3 0 1 < < < < < < 1 6
第一行
1.P:代表护照
2.O:代表护照类型
3-5:国家代码,见最后
6-44:39位姓名,姓和名之间用<<隔开,姓(Surname)和名(Given names)若有多个单词则用<隔开,最后用<补足39个字符
第二行
1-9:护照号码
10:1-9的验证码,验证算法如下
int Compute(string source)
{
string s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int[] w = new int[] { 7, 3, 1 };
int c = 0;
for (int i = 0; i < source.Length; i++)
{
if (source[i] == '<')
continue;
c += s.IndexOf(source[i]) * w[i % 3];
}
c %= 10;
return c;
}
11-13:国家代码
14-19:生日
20:生日的验证码,验证规则同上
21:性别(M:男,F:女)
22-27:护照有效期
28:护照有效期验证码
29-42:个人代码,每个国家都不一样
43:个人代码的验证码
44:第二行1-10,14-20,22-43的验证码
var line2string = "G489476464CHN7304279M210126619203301<<<<<<16";
var lastvalue = Compute(line2string.Substring(0, 10) + line2string.Substring(13, 7) + line2string.Substring(21, 22)); //lastvalue=6
附:国家代码表
ABW:阿鲁巴
AFG:阿富汗
AGO:安哥拉
AIA:安圭拉
ALA:奥兰群岛
ALB:阿尔巴尼亚
AND:安道尔
ANT:荷属安的列斯
ARE:阿联酋
ARG:阿根廷
ARM:亚美尼亚
ASM:美属萨摩亚
ATA:南极洲
ATF:法属南领地
ATG:安提瓜和巴布达
AUS:澳大利亚
AUT:奥地利
AZE:阿塞拜疆
BDI:布隆迪
BEL:比利时
BEN:贝宁
BES:博内尔岛、圣尤斯特歇斯岛和萨巴岛
BFA:布基纳法索
BGD:孟加拉国
BGR:保加利亚
BHR:巴林
BHS:巴哈马
BIH:波黑
BLM:圣巴泰勒米岛
BLR:白俄罗斯
BLZ:伯利兹
BMU:百慕大
BOL:玻利维亚
BRA:巴西
BRB:巴巴多斯
BRN:文莱
BTN:不丹
BVT:布维岛
BWA:博茨瓦纳
CAF:中非
CAN:加拿大
CB:加那利群岛
CCK:科科斯(基灵)群岛
CE:塞卜泰(休达)
CHE:瑞士
CHL:智利
CHN:中国
CIV:科特迪瓦
CMR:喀麦隆
COD:刚果(金)
COG:刚果(布)
COK:库克群岛
COL:哥伦比亚
COM:科摩罗
CPV:佛得角
CRI:哥斯达黎加
CT:坎顿和恩德贝里群岛
CUB:古巴
CUW:库拉索
CXR:圣诞岛
CYM:开曼群岛
CYP:塞浦路斯
CZE:捷克
DEU:德国
DJI:吉布提
DMA:多米尼克
DNK:丹麦
DOM:多米尼加
DZA:阿尔及利亚
ECU:厄瓜多尔
EGY:埃及
ERI:厄立特里亚
ESH:西撒哈拉
ESP:西班牙
EST:爱沙尼亚
ETH:埃塞俄比亚
FIN:芬兰
FJI:斐济
FLK:福克兰群岛(马尔维纳斯)
FRA:法国
FRO:法罗群岛
FSM:密克罗尼西亚联邦
GAB:加蓬
GBD:英国(属地公民)
GBN:英国(国民(海外))
GBO:英国(海外公民)
GBP:英国(被保护人)
GBR:英国
GBS:英国(臣民)
GEO:格鲁吉亚
GGY:根西岛
GHA:加纳
GIB:直布罗陀
GIN:几内亚
GLP:瓜德罗普
GMB:冈比亚
GNB:几内亚比绍
GNQ:赤道几内亚
GRC:希腊
GRD:格林纳达
GRL:格陵兰
GTM:危地马拉
GUF:法属圭亚那
GUM:关岛
GUY:圭亚那
HKG:中国香港
HMD:赫德岛和麦克唐纳群岛
HND:洪都拉斯
HRV:克罗地亚
HTI:海地
HUN:匈牙利
IDN:印度尼西亚
IMN:马恩岛
IND:印度
IOT:英属印度洋领地
IRL:爱尔兰
IRN:伊朗
IRQ:伊拉克
ISL:冰岛
ISR:以色列
ITA:意大利
JAM:牙买加
JEY:泽西
JI:贾维斯岛(大洋洲)
JOR:约旦
JPN:日本
JTN:约翰斯顿岛
KAZ:哈萨克斯坦
KEN:肯尼亚
KGZ:吉尔吉斯斯坦
KHM:柬埔寨
KIR:基里巴斯
KNA:圣基茨和尼维斯
KOR:韩国
KWT:科威特
LAO:老挝
LBN:黎巴嫩
LBR:利比里亚
LBY:利比亚
LCA:圣卢西亚
LIE:列支敦士登
LKA:斯里兰卡
LSO:莱索托
LTU:立陶宛
LUX:卢森堡
LVA:拉脱维亚
MAC:中国澳门
MAF:圣马丁岛(法属)
MAR:摩洛哥
MCO:摩纳哥
MDA:摩尔多瓦
MDG:马达加斯加
MDV:马尔代夫
ME:梅利利亚
MEX:墨西哥
MHL:马绍尔群岛
MID:中途岛
MKD:北马其顿
MLI:马里
MLT:马耳他
MMR:缅甸
MNE:黑山
MNG:蒙古
MNP:北马里亚纳群岛
MOZ:莫桑比克
MRT:毛里塔尼亚
MSR:蒙特塞拉特
MTQ:马提尼克
MUS:毛里求斯
MWI:马拉维
MYS:马来西亚
MYT:马约特
NAM:纳米比亚
NCL:新喀里多尼亚
NER:尼日尔
NFK:诺福克岛
NGA:尼日利亚
NIC:尼加拉瓜
NIU:纽埃
NLD:荷兰
NN:无国籍
NOR:挪威
NPL:尼泊尔
NQ:毛德地
NRU:瑙鲁
NTZ:中立区
NZL:新西兰
OMN:阿曼
PAK:巴基斯坦
PAN:巴拿马
PCN:皮特凯恩
PER:秘鲁
PHL:菲律宾
PLW:帕劳
PNG:巴布亚新几内亚
POL:波兰
PRI:波多黎各
PRK:朝鲜
PRT:葡萄牙
PRY:巴拉圭
PSE:巴勒斯坦
PUS:美属太平洋群岛
PYF:法属波利尼西亚
PZ:巴拿马运河带
QAT:卡塔尔
REU:留尼汪岛
ROU:罗马尼亚
RUS:俄罗斯
RWA:卢旺达
SAU:沙特
SDN:苏丹
SEN:塞内加尔
SGP:新加坡
SGS:南乔治亚和南桑威奇群岛
SHN:圣赫勒拿岛、阿森松岛和特里斯坦达库尼亚群岛
SJM:斯瓦尔巴和扬马延群岛
SLB:所罗门群岛
SLE:塞拉利昂
SLV:萨尔瓦多
SMR:圣马力诺
SOM:索马里
SP:萨巴
SPM:圣皮埃尔和密克隆
SQ:圣马丁岛
SRB:塞尔维亚
SS:塞班
SSD:南苏丹
STP:圣多美和普林西比
SUR:苏里南
SVK:斯洛伐克
SVN:斯洛文尼亚
SWE:瑞典
SWZ:斯威士兰
SXM:圣马丁岛(荷属)
SYC:塞舌尔
SYR:叙利亚
TCA:特克斯和凯科斯群岛
TCD:乍得
TGO:多哥
THA:泰国
TJK:塔吉克斯坦
TKL:托克劳群岛
TKM:土库曼斯坦
TLS:东帝汶
TON:汤加
TTO:特立尼达和多巴哥
TUN:突尼斯
TUR:土耳其
TUV:图瓦卢
TWN:中国台湾
TX:塔希提
TZA:坦桑尼亚
UGA:乌干达
UKR:乌克兰
UMI:美国本土外小岛屿
UN:联合国
UNA:联合国
UNO:联合国
URY:乌拉圭
USA:美国
UZB:乌兹别克斯坦
VAT:梵蒂冈
VCT:圣文森特和格林纳丁斯
VEN:委内瑞拉
VGB:维尔京群岛(英属)
VIR:维尔京群岛(美属)
VNM:越南
VUT:瓦努阿图
WAK:威克岛
WLF:瓦利斯和富图纳群岛
WSM:萨摩亚
XXA:无国籍(无国籍人)
XXB:被联合国承认的难民
XXC:不被联合国承认的难民
XXX:国籍不明
YEM:也门
YKS:科索沃
ZAF:南非
ZMB:赞比亚
ZWE:津巴布韦
ZZZ:国籍不详