วิธีอ่านและตรวจสอบ MRZ ในหนังสือเดินทางด้วย check digit มาตรฐาน ICAO 9303
ใช้ MRZ Parser ฟรีแปลงโซน machine readable zone ของหนังสือเดินทาง TD3 และบัตรประจำตัว TD1 เป็นเลขที่เอกสาร ชื่อ วันเกิด วันหมดอายุ และสัญชาติ พร้อมตรวจสอบ check digit ตามมาตรฐาน ICAO 9303 ทำงานในเบราว์เซอร์ทั้งหมด ไม่มีการอัปโหลดข้อมูล
Table of Contents
วิธีอ่านและตรวจสอบ MRZ ในหนังสือเดินทางด้วย check digit มาตรฐาน ICAO 9303
สองบรรทัดอักขระที่อยู่ด้านล่างของหน้าข้อมูลในหนังสือเดินทางทุกเล่มไม่ใช่ลวดลายตกแต่ง แต่คือ machine readable zone (MRZ) ซึ่งเป็นบันทึกข้อมูลตัวตนแบบกระชับตามมาตรฐานสากล และบันทึกชุดนี้มีระบบ checksum ของตัวเองด้วย ประเทศที่ออกหนังสือเดินทางทั่วโลกยึดตาม ICAO Doc 9303 ซึ่งกำหนดว่าเลขที่เอกสาร ชื่อ วันที่ และสัญชาติถูกวางเรียงอย่างไร รวมถึงวิธีป้องกันฟิลด์สำคัญแต่ละฟิลด์ด้วย check digit ที่คอมพิวเตอร์ทุกเครื่องคำนวณซ้ำได้
การอ่านโซนนี้ด้วยตาเปล่าทำได้ยากและผิดพลาดง่าย เพราะมีทั้งตัวอักษร filler, วันที่แบบหกหลัก และเลขที่เอกสารเก้าหลักปนกันมา ตัว MRZ Parser ฟรีช่วยทำงานนี้แทนคุณ รองรับทั้งฟอร์แมต TD3 ของหนังสือเดินทาง (2 บรรทัด บรรทัดละ 44 อักขระ) และ TD1 ของบัตรประจำตัว (3 บรรทัด บรรทัดละ 30 อักขระ) ดึงข้อมูลทุกฟิลด์ออกมา และตรวจสอบ check digit ทุกตัวด้วยกฎการถ่วงน้ำหนักตาม ICAO 9303 โดยประมวลผลฝั่ง client 100% ข้อมูลที่วางเข้าไปไม่เคยออกจากเบราว์เซอร์ของคุณ
บทความนี้จะพาไปดูวิธีใช้งานเครื่องมือ หลักการทำงานของระบบ check digit พร้อมตัวอย่างการคำนวณแบบละเอียด และกรณีการใช้งานจริง เช่น การทดสอบซอฟต์แวร์ การตรวจความถูกต้องของ OCR และการทำต้นแบบฟอร์ม
ทำไมต้องใช้ MRZ Parser?
- ดึงข้อมูลครบในทันที วางโค้ดสองหรือสามบรรทัด แล้วได้เลขที่เอกสาร นามสกุล ชื่อต้น วันเกิด วันหมดอายุ เพศ และสัญชาติทันที ไม่ต้องนับตำแหน่งอักขระด้วยมือ
- ตรวจสอบตาม ICAO 9303 จริง check digit ทุกตัว (เลขที่เอกสาร วันเกิด วันหมดอายุ optional data และ composite ของ TD3) ถูกคำนวณใหม่จากศูนย์แล้วเทียบกับค่าใน MRZ ทำให้จับบรรทัดที่พิมพ์ผิดได้ ไม่ปล่อยผ่านแบบเงียบ ๆ
- รองรับสองฟอร์แมตหลัก ระบบ TD3 (2 x 44) และ TD1 (3 x 30) ให้อัตโนมัติจากจำนวนบรรทัดและความยาว พร้อมข้อความ error ชัดเจนเมื่อบรรทัดสั้นหรือยาวเกิน หรือมีอักขระที่ไม่ถูกต้อง
- มีตัวอย่าง specimen ที่ถูกต้องในตัว มีทั้งตัวอย่างหนังสือเดินทาง TD3 และบัตร TD1 ที่ checksum ถูกต้อง ลองเล่นเครื่องมือได้ก่อนแตะเอกสารจริง
- เป็นส่วนตัว 100% ทุกอย่างประมวลผลด้วย JavaScript ในเบราว์เซอร์ ไม่มีการอัปโหลด ไม่มีการเรียกเซิร์ฟเวอร์ และไม่มี log ของข้อมูลที่วางเข้าไป
- แปลงวันที่ให้อ่านง่าย ค่า YYMMDD ดิบถูกแปลงเป็นวันที่ที่อ่านได้ และช่องชื่อถูกแยกนามสกุลกับชื่อต้นถูกต้องตามขอบเขต double-filler
ฟีเจอร์หลัก
| ฟีเจอร์ | ทำอะไร |
|---|---|
| อ่าน MRZ หนังสือเดินทาง TD3 | อ่าน 2 บรรทัด 44 อักขระ: ประเภทเอกสาร รัฐผู้ออก ช่องชื่อ เลขที่เอกสาร สัญชาติ วันที่ เพศ และ optional data |
| อ่าน MRZ บัตร TD1 | อ่าน 3 บรรทัด 30 อักขระ: รหัสเอกสาร ผู้ออก เลขที่เอกสาร วันที่ สัญชาติ optional data และบรรทัดชื่อ |
| ตรวจสอบ check digit | คำนวณ check digit ทุกตัวใหม่ด้วยอัลกอริทึมถ่วงน้ำหนัก 7-3-1 แล้วแสดงค่าที่ควรเป็นเทียบกับค่าจริงรายฟิลด์ |
| Composite check digit (TD3) | ตรวจ checksum ตัวสุดท้ายที่ครอบคลุมเลขที่เอกสารและฟิลด์วันที่ในบรรทัดที่ 2 |
| ตัวอย่าง specimen | โหลดตัวอย่าง TD3 และ TD1 ที่ checksum ถูกต้องได้ในคลิกเดียวเพื่อใช้ทดสอบ |
| ทำงานฝั่ง client เท่านั้น | ไม่มีการเรียกเครือข่าย การ parse และตรวจสอบเกิดขึ้นในเบราว์เซอร์ทั้งหมด |
จุดที่น่าสนใจเพิ่มเติมอีกเล็กน้อย:
- เก็บกวาดอินพุตอัตโนมัติ ตัดช่องว่าง tab และขีดออกจากข้อความ พร้อมแปลงตัวพิมพ์เล็กเป็นพิมพ์ใหญ่ แก้ปัญหาการวางข้อความที่พบบ่อยที่สุดสองแบบ
- สถานะ error ชัดเจน จำนวนบรรทัดผิด ความยาวผิด และอักขระต้องห้าม แต่ละอย่างมีข้อความเฉพาะ ไม่ใช่ผลลัพธ์งง ๆ
วิธีการใช้งาน
- เปิด MRZ Parser ในเบราว์เซอร์
- กดปุ่ม TD3 passport sample หรือ TD1 ID card sample เพื่อโหลดตัวอย่างในตัว หรือวางบรรทัด MRZ จากเอกสารของคุณเองลงในช่อง input
- ดูฟอร์แมตที่ระบบตรวจพบ เครื่องมือจะบอกว่าเป็น "TD3 passport booklet (2 x 44)" หรือ "TD1 ID card (3 x 30)" ตามข้อมูลที่ป้อน
- ตรวจฟิลด์ที่ดึงออกมา: เลขที่เอกสาร ชื่อ นามสกุล วันเกิด วันหมดอายุ เพศ สัญชาติ และ optional data
- ดูแผงผลตรวจสอบ ทุกฟิลด์จะมีป้ายสีเขียวเมื่อ check digit ตรงกัน และมีคำเตือนเมื่อไม่ตรง จากนั้นแก้ข้อความแล้ว parse ใหม่ได้เลย
รู้จัก ICAO 9303 และระบบ check digit
ICAO Doc 9303 กำหนดเลย์เอาต์ MRZ สองแบบที่พบบ่อยที่สุด TD3 คือฟอร์แมตหนังสือเดินทาง 2 บรรทัด บรรทัดละ 44 อักขระ บรรทัดที่ 1 เก็บรหัสประเภทเอกสาร รหัสรัฐผู้ออกสามตัวอักษร และช่องชื่อในรูป SURNAME<<GIVEN<NAMES ตามด้วย filler จนครบ 44 ตำแหน่งพอดี บรรทัดที่ 2 เก็บเลขที่เอกสาร 9 หลักพร้อม check digit, รหัสสัญชาติ, วันเกิด (YYMMDD) พร้อม check digit, รหัสเพศหนึ่งตัวอักษร, วันหมดอายุ (YYMMDD) พร้อม check digit, ช่อง optional data พร้อม check digit และปิดท้ายด้วย composite check digit ที่คำนวณจากข้อมูลทั้งหมดที่อยู่ข้างหน้า
TD1 คือฟอร์แมตบัตรประจำตัว 3 บรรทัด บรรทัดละ 30 อักขระ บรรทัดที่ 1 อัดรหัสเอกสาร รัฐผู้ออก และเลขที่เอกสารพร้อม check digit ไว้ด้วยกัน บรรทัดที่ 2 เก็บวันเกิด เพศ วันหมดอายุ สัญชาติ และ optional data พร้อม check digit ส่วนบรรทัดที่ 3 เป็นช่องชื่อ โดยในการทำงานนี้ TD1 ไม่มี composite check digit ตาม ICAO 9303 Part 5
ตัวอัลกอริทึม check digit เรียบง่ายพอที่จะคำนวณด้วยมือ อักขระแต่ละตัวแปลงเป็นตัวเลข: ตัวเลขใช้ค่าเดิม ตัวอักษร A=10 ไปจนถึง Z=35 และตัว filler นับเป็น 0 จากนั้นนำค่าไปคูณกับลำดับน้ำหนักที่วนซ้ำ 7, 3, 1, 7, 3, 1, ... แล้วรวมกัน check digit คือเลขโดดสุดท้ายของผลรวม (ผลรวม modulo 10)
ตัวอย่างการคำนวณเต็มรูปแบบจากเลขที่เอกสารของหนังสือเดินทางตัวอย่าง คือ L898902C3:
| อักขระ | L | 8 | 9 | 8 | 9 | 0 | 2 | C | 3 |
|---|---|---|---|---|---|---|---|---|---|
| ค่า | 21 | 8 | 9 | 8 | 9 | 0 | 2 | 12 | 3 |
| น้ำหนัก | 7 | 3 | 1 | 7 | 3 | 1 | 7 | 3 | 1 |
| ผลคูณ | 147 | 24 | 9 | 56 | 27 | 0 | 14 | 36 | 3 |
ผลคูณรวมกันได้ 147 + 24 + 9 + 56 + 27 + 0 + 14 + 36 + 3 = 316 และ 316 modulo 10 เท่ากับ 6 ซึ่งตรงกับ check digit ที่ตามหลังเลขที่เอกสารในบรรทัดที่ 2 ของตัวอย่างพอดี วิธีเดียวกันนี้ใช้ตรวจวันเกิด (740812 ได้ 2) และวันหมดอายุ (120415 ได้ 9)
เมื่อ check digit ไม่ผ่านหมายความว่าอะไร? เกือบทั้งหมดเกิดจาก error ของ OCR หรือการคีย์ข้อมูล ไม่ใช่สัญญาณของเอกสารปลอม เพราะโซน MRZ ถูกอ่านด้วยเครื่องจากเอกสารสิ่งพิมพ์ที่อาจผ่านการใช้งานมามาก ตัวอักษรเพียงตัวเดียวที่อ่านผิดก็ทำให้ checksum พังทันที เมื่อเครื่องมือแจ้งเตือนฟิลด์ใด ให้กลับไปตรวจข้อความ input หาอักขระหน้าตาคล้ายกันก่อน ก่อนจะสรุปอะไรเกี่ยวกับตัวเอกสาร
คำเตือนเรื่องความเป็นส่วนตัว: ข้อมูลใน MRZ ทั้งหมด ทั้งชื่อเต็ม เลขที่เอกสาร วันเกิด และสัญชาติ เป็นข้อมูลส่วนบุคคลที่อ่อนไหว ให้ถือว่าผลลัพธ์ที่ parse แล้วเป็นข้อมูลลับ และอย่าวางบรรทัดจากเอกสารจริงลงในเครื่องมือใด ๆ ที่คุณไม่ได้เป็นผู้ควบคุม ควรใช้ตัวอย่าง specimen ในตัวสำหรับการสาธิต จับภาพหน้าจอ และการแชร์
กรณีการใช้งานจริง
ทดสอบซอฟต์แวร์งานด่านตรวจและระบบลงทะเบียน
ทีมที่พัฒนาระบบ check-in, ระบบจัดการด่านตรวจ หรือระบบลงทะเบียนที่พัก ต้องการชุดข้อมูล MRZ จำลองที่สมจริง ตัวอย่าง specimen ให้ input แบบ TD3 และ TD1 ที่โครงสร้างถูกต้องพร้อม checksum ครบ และการแก้ตัวอักษรเดียวให้พังโดยเจตนาก็เปลี่ยนเป็น test case แบบ known-bad สำหรับตรวจว่าซอฟต์แวร์ของคุณปฏิเสธบรรทัดที่ถูกแก้ไขได้จริง
ตรวจความถูกต้องของ pipeline OCR
ถ้าคุณสแกนหนังสือเดินทางด้วย OCR check digit ของ MRZ คือด่านคุณภาพฟรี ๆ pipeline ที่อ่านโซนได้ถูกต้องจะผ่าน checksum ทั้งห้าตัวของ TD3 ส่วนการอ่านผิดจะโผล่ให้เห็นทันที การนำบรรทัดที่ถูกต้องและบรรทัดที่แก้ให้พังมาทดลองกับเครื่องมือนี้ ช่วยให้คุณตั้งเกณฑ์การยอมรับของ pipeline ได้แม่นขึ้น
ต้นแบบฟอร์มเติมข้อมูลอัตโนมัติ
ผลิตภัณฑ์ที่เติมฟอร์มสมัครหรือ KYC อัตโนมัติจากหนังสือเดินทาง ต้องใช้ field mapping แบบเดียวกับที่ parser สาธิต: การแยกช่องชื่อที่ขอบเขต double-filler, การแปลงวันที่ YYMMDD และการ normalize รหัสสัญชาติ ใช้เครื่องมือนี้ทดลองและตรวจ mapping ก่อนเขียนโค้ดเชื่อมต่อจริง
การเรียนรู้เรื่องเอกสาร
นักพัฒนา วิศวกร QA และนักศึกษาเข้าใจเลย์เอาต์ MRZ ได้เร็วที่สุดจากตัวอย่างจริง การโหลด specimen แล้วส่องดูว่าตำแหน่งอักขระแต่ละตำแหน่งคือฟิลด์ใด และ check digit แต่ละตัวมาจากไหน ทำให้มาตรฐาน ICAO 9303 จับต้องได้ ไม่ใช่แค่ทฤษฎีลอย ๆ
แนวทางปฏิบัติที่ดี
- ใช้ข้อมูล specimen สำหรับการสาธิต ตัวอย่าง TD3 และ TD1 ในตัวถูกต้องและปลอดภัยที่จะใช้ในภาพหน้าจอ งานบรรยาย และชุดทดสอบ
- ตรวจ check digit ให้ครบทุกตัว ไม่ใช่แค่ตัวเดียว เลขที่เอกสารผ่านได้ทั้งที่วันหมดอายุพัง มีแผงสีเขียวเต็มหน้าจอนั่นแหละที่บอกว่าบรรทัดนี้สอดคล้องกันภายใน
- จัดการ filler ให้ถูกต้อง filler คือ padding ตามกฎหมาย ไม่ใช่ตัวพิมพ์ผิด: มีค่าเป็น 0 ในการคำนวณ check digit และใช้แบบ double-filler แยกนามสกุลออกจากชื่อต้น
- ยืนยันฟอร์แมตก่อนตีความฟิลด์ ตรวจว่าเป็น 2 x 44 (TD3) หรือ 3 x 30 (TD1) เพราะตำแหน่งฟิลด์ของสองเลย์เอาต์ต่างกัน
- พิมพ์ใหม่แทนการเดาเมื่อล้มเหลว เมื่อ check digit ไม่ผ่าน ให้สงสัยอักขระหน้าตาคล้ายกัน (8/B, 0/O, 1/I) ใน input ก่อนเป็นอันดับแรก
- ลดการเปิดเผยข้อมูล parse เฉพาะที่จำเป็น หลีกเลี่ยงการเก็บข้อความ MRZ ดิบ และอย่าวางบรรทัดจากเอกสารจริงลงในเครื่องมือที่คุณไม่ได้ควบคุม
เริ่มใช้งาน MRZ Parser เลย
ไม่ว่าคุณจะกำลังสร้างซอฟต์แวร์สแกนเอกสาร ตรวจสอบ pipeline OCR หรือแค่อยากรู้ว่าสองบรรทัดด้านล่างหนังสือเดินทางเก็บข้อมูลอะไรไว้ MRZ Parser ให้การดึงฟิลด์ทันทีพร้อมการตรวจ check digit ตาม ICAO 9303 อย่างแท้จริง — ฟรี ไม่ต้องสมัครสมาชิก และทำงานในเบราว์เซอร์ของคุณทั้งหมด
เครื่องมือที่เกี่ยวข้องที่คุณอาจสนใจ:
- GTIN Validator — ตรวจสอบรหัสสินค้า GTIN-8, GTIN-12, GTIN-13 และ GTIN-14 พร้อม checksum
- Thai ID Validator — ตรวจสอบเลขบัตรประจำตัวประชาชนไทยและ check digit
- IMEI Checker — ตรวจสอบหมายเลข IMEI ด้วยอัลกอริทึม Luhn และการวิเคราะห์ TAC
ขอให้สนุกกับการ parse ครับ
คำถามที่พบบ่อย
ถ: MRZ ในหนังสือเดินทางคืออะไร?
ตอบ: machine readable zone คือบล็อกข้อความ OCR-B สองบรรทัด (TD3, 44 อักขระต่อบรรทัด) ด้านล่างหน้าข้อมูลของหนังสือเดินทาง เก็บประเภทเอกสาร รัฐผู้ออก ชื่อ เลขที่เอกสาร สัญชาติ วันเกิด เพศ และวันหมดอายุตามเลย์เอาต์คงที่ที่ ICAO 9303 กำหนด โดยมี check digit ป้องกันฟิลด์สำคัญ
ถ: TD3 กับ TD1 ต่างกันอย่างไร?
ตอบ: TD3 คือฟอร์แมตหนังสือเดินทาง 2 บรรทัด 44 อักขระ ส่วน TD1 คือฟอร์แมตบัตรประจำตัวทั่วไป 3 บรรทัด 30 อักขระ โดยย้ายช่องชื่อไปไว้บรรทัดที่สาม เครื่องมือจะตรวจจับฟอร์แมตอัตโนมัติจากจำนวนบรรทัดและความยาวของข้อความที่วาง
ถ: ทำไม check digit ถึงไม่ผ่านทั้งที่เอกสารดูปกติ?
ตอบ: สาเหตุเกือบทั้งหมดคือ error จากการคีย์หรือการอ่าน OCR ในขั้น input เพราะอักขระผิดเพียงตัวเดียวในฟิลด์ที่ถูกป้องกันก็ทำให้ checksum ไม่ตรง ให้ตรวจอักขระหน้าตาคล้ายกัน เช่น 8 กับ B, 0 กับ O, 1 กับ I ก่อนจะสงสัยตัวเอกสาร
ถ: ข้อมูลของฉันถูกส่งไปเซิร์ฟเวอร์หรือไม่?
ตอบ: ไม่ MRZ Parser ทำงานฝั่ง client 100% ในเบราว์เซอร์ ข้อมูลที่ป้อนไม่เคยถูกอัปโหลด เก็บ หรือบันทึก log ซึ่งเป็นเหตุผลเดียวกับที่คุณควรหลีกเลี่ยงการวางข้อมูลเอกสารจริงลงในเครื่องมือที่คุณไม่ได้ควบคุม
ถ: เครื่องมืออ่านจากรูปถ่ายหรือไฟล์สแกนหนังสือเดินทางได้ไหม?
ตอบ: ไม่ได้ เครื่องมือทำงานกับข้อความ MRZ เท่านั้น ถ้าเริ่มจากรูปภาพ ให้ผ่าน OCR ก่อนแล้ววางบรรทัดผลลัพธ์สองหรือสามบรรทัด การตรวจ check digit จะบอกได้ว่า OCR อ่านข้อความได้ถูกต้องหรือไม่