ملی ای‌پی‌آی

چرا نام کاربر با ثبت احوال نمی‌خواند؟ شش علت مغایرت نام

مغایرت نام در احراز هویت بیشتر از آنکه تقلب باشد، تفاوت نگارش است: ی و ک عربی، فاصله و نیم‌فاصله، ترتیب نام و صورت رایج به‌جای شناسنامه‌ای.

بیشتر مغایرت‌های نام در احراز هویت تقلب نیست؛ دو نفر یک اسم را به دو شکل نوشته‌اند. کاربری که «محمدرضا» را با یک فاصله وسط می‌نویسد، همان آدم است، ولی مقایسهٔ حرف‌به‌حرف او را رد می‌کند.

این نوشته فهرست جاهایی است که نام فارسی بین فرم شما و پایگاه ثبت احوال تغییر شکل می‌دهد، و اینکه هر کدام را چطور پیش از استعلام جمع کنید. اگر بعد از آن هم تفاوتی ماند، سرویس تطابق درصدی اطلاعات هویتی به‌جای «بله یا خیر» یک عدد می‌دهد و تصمیم را به شما برمی‌گرداند.

شش جایی که یک نام عوض می‌شود

ی و ک عربی

کیبوردهای عربی و متن‌های کپی‌شده از بعضی وب‌سایت‌ها به‌جای «ی» و «ک» فارسی، همتاهای عربی‌شان (U+064A و U+0643) را می‌گذارند. روی صفحه فرقی دیده نمی‌شود، ولی دو نویسهٔ متفاوت‌اند. فرض کنید کاربری نام «علی» را از یک پیام کپی کرده که ی عربی دارد. چشم انسان همان «علی» را می‌خواند؛ مقایسهٔ رشته‌ای نه.

فاصله، نیم‌فاصله و چسبیده

«عبدالله»، «عبد الله» و «عبد‌الله» سه رشتهٔ مختلف‌اند. همین برای «محمدرضا»، «علی‌اکبر» و «امیرحسین» هم صدق می‌کند. در شناسنامه یکی از این شکل‌ها ثبت شده و کاربر ممکن است هر شکل دیگری را تایپ کند.

ترتیب نام و نام خانوادگی

فرم‌هایی که یک کادر «نام کامل» دارند، ترتیب را به کاربر واگذار می‌کنند. بعضی «نام + نام خانوادگی» می‌نویسند، بعضی برعکس، مثل فرم‌های لاتین. اگر نام و نام خانوادگی در فرم شما دو کادر جدا ندارند، پیش از ارسال حدس زدن ترتیب بدترین راه است؛ بهتر است جدا بگیرید و خودتان به‌ترتیب ثابت بچسبانید.

صورت رایج به‌جای صورت شناسنامه‌ای

آدم‌ها با نام رایجشان زندگی می‌کنند، نه همیشه با نامی که در شناسنامه است. کسی که در شناسنامه «محمدرضا» است ممکن است همه‌جا «رضا» بنویسد. این مغایرت نه خطای تایپ است نه تقلب؛ صرفاً دو لایه از یک هویت است.

املای متفاوت برای یک نام

بعضی نام‌ها بیش از یک املا دارند و هر دو در متن‌های روزمره دیده می‌شوند. مثال‌های فرضی: «اسماعیل» با «اسمعیل»، «مرتضی» با «مرتضا». کدام شکل در پایگاه ثبت شده، به سال و دفتر صدور بستگی دارد و شما از بیرون نمی‌دانید.

نویسه‌های نامرئی و اعراب

نیم‌فاصلهٔ ته نام، نویسهٔ جهت‌نما که از متن راست‌به‌چپ کپی شده، کشیده (ـ) و اعراب. هیچ‌کدام دیده نمی‌شوند و همه‌شان یک رشتهٔ «ظاهراً یکسان» را عوض می‌کنند. این‌ها رایج‌ترین علت مغایرتی‌اند که «بی‌دلیل» به نظر می‌رسد.

پیش از ارسال چه چیزی را یکدست کنید

قاعدهٔ ساده: هر چه ماشین می‌تواند یکدست کند، نباید به عهدهٔ کاربر یا مقایسه باشد.

  • ی و ک عربی را به فارسی تبدیل کنید.
  • نویسه‌های نامرئی، کشیده و اعراب را حذف کنید.
  • فاصله‌های پشت‌سرهم را یکی کنید و ابتدا و انتهای رشته را بزنید.
  • ارقام و علامت‌هایی که در نام نیامده‌اند را رد کنید یا بردارید.

چیزی که یکدست نکنید: فاصله و نیم‌فاصلهٔ داخل نام. اینجا شما نمی‌دانید شکل درست کدام است و دست‌بردن در آن گاهی خودش مغایرت می‌سازد. همین جاست که شباهت درصدی به کار می‌آید.

درصد شباهت از کجا کمک می‌کند

سرویس ما چهار عدد جدا برمی‌گرداند: شباهت نام، نام خانوادگی، نام کامل و نام پدر. ورودی‌اش کد ملی، تاریخ تولد و نام است؛ نام پدر اختیاری است و اگر ندهید، درصد آن برنمی‌گردد.

چرا چهار عدد بهتر از یک عدد است؟ چون مغایرت‌هایی که بالا گفتیم یک‌جا جمع نمی‌شوند. «رضا» به‌جای «محمدرضا» عدد نام را پایین می‌آورد ولی نام خانوادگی دست‌نخورده می‌ماند. اگر فقط یک عدد داشتید، این تفاوت را از یک اشتباه در نام خانوادگی تشخیص نمی‌دادید. با چهار عدد می‌توانید بگویید: نام خانوادگی باید تقریباً کامل بخواند، نام می‌تواند کمی فاصله داشته باشد.

اینجا جزئیات ورودی و خروجی را ببینید؛ مهم‌ترینش این است که پاسخ، خود نام ثبت‌شده را نشان نمی‌دهد، فقط میزان شباهت را.

مثال: یک قاعده، سه نتیجه

تصور کنید یک پلتفرم تسهیلات‌دهی نام کاربر را با پایگاه ثبت احوال می‌سنجد. قاعدهٔ فرضی‌اش این است:

  • نام خانوادگی و نام کامل هر دو بالا: ادامه.
  • نام خانوادگی بالا، نام یا نام کامل پایین: صف بررسی دستی، با پیامی که می‌گوید نام را مطابق شناسنامه وارد کنید.
  • نام خانوادگی هم پایین: خطای قابل اصلاح، یک بار دیگر فرصت.

عددها را عمداً ننوشتیم. مرز را باید روی داده خودتان تنظیم کنید؛ این موضوع را در نوشتهٔ تنظیم آستانهٔ شباهت نام جداگانه باز کرده‌ایم.

آنچه این روش حل نمی‌کند

سه چیز را از درصد شباهت انتظار نداشته باشید.

اول، فرمول محاسبهٔ درصد را ما نمی‌دانیم و ادعایش نمی‌کنیم. فرض نکنید ۹۰ یعنی «یک حرف فرق دارد». رفتارش را باید با نمونهٔ واقعی خودتان بسنجید.

دوم، نام ثبت‌شده را نمی‌دهد؛ پس نمی‌توانید به کاربر بگویید «در شناسنامهٔ شما چه نوشته». ناچارید از او بخواهید نام را مطابق شناسنامه وارد کند.

سوم، تأیید هویت نیست. درصد بالا فقط می‌گوید نامی که دارید با نامِ متعلق به آن کد ملی و تاریخ تولد نزدیک است؛ نمی‌گوید پشت صفحه همان آدم نشسته است.

نمونه: تابع یکدست‌سازی نام

تابعی که پیش از هر استعلام روی نام اجرا می‌شود، کوتاه است. این نسخه عمداً نویسه‌های عربی را با کد عددی یونیکد می‌سازد تا خودش دچار همان مشکل نشود:

ts const chr = (...codes: number[]) => String.fromCharCode(...codes); const ARABIC_YEH = new RegExp([${chr(0x064a, 0x0649)}], "g"); const ARABIC_KAF = new RegExp(chr(0x0643), "g"); const MARKS = new RegExp([${chr(0x064b)}-${chr(0x065f)}${chr(0x0640)}], "g"); const DIRECTION = new RegExp([${chr(0x200e, 0x200f)}${chr(0x202a)}-${chr(0x202e)}]`, "g");

function normalizeName(input: string): string { return input .replace(ARABIC_YEH, chr(0x06cc)) .replace(ARABIC_KAF, chr(0x06a9)) .replace(MARKS, "") .replace(DIRECTION, "") .replace(/\s+/g, " ") .trim(); } ```

این تابع نیم‌فاصله را دست نمی‌زند و فاصله را حذف نمی‌کند، چون تصمیم دربارهٔ آن‌ها بر عهدهٔ شباهت درصدی است. نکته‌ای که زیاد فراموش می‌شود: همین تابع را روی ورودی هر مسیر ثبت‌نام اجرا کنید، نه فقط یکی از آن‌ها. اگر فرم وب نرمال می‌کند و اپ موبایل نه، نصف مغایرت‌ها از اپ می‌آید و شما فکر می‌کنید مشکل از کاربر است.

چه چیزی را ثبت کنید تا بعداً بفهمید

برای اینکه ببینید کدام علت بیشتر رخ می‌دهد، لازم نیست نام کاربران را ذخیره کنید. کافی است نوع تغییر را بشمارید: چند نام ی/ک عربی داشت، چند نام فاصلهٔ اضافه داشت، چند بار نام و نام خانوادگی جابه‌جا بود. بعد از چند هفته، شمارنده‌ها نشان می‌دهند اصلاح رابط کجا بیشترین اثر را دارد. این شمارنده‌ها هیچ داده هویتی نگه نمی‌دارند.

پرسش‌هایی که پشتیبانی می‌شنود

«من اسمم را درست نوشتم، چرا رد شد؟» پاسخی که کمک می‌کند این است: نام را دقیقاً مطابق شناسنامه وارد کنید، با همان فاصله‌ها. اگر نمی‌دانید شناسنامه‌تان چه نوشته، عکسش را نگاه کنید. و چون شما از نام ثبت‌شده خبر ندارید، نمی‌توانید به او نشانش دهید؛ این یکی از محدودیت‌های قطعی است که در طراحی پیام باید لحاظ شود.

اگر عجله دارید

به نظر من اولین کاری که باید بکنید ساختن تابع یکدست‌سازی نام است، پیش از هر استعلامی. بعد، نام و نام خانوادگی را در دو کادر جدا بگیرید. و اگر باز هم مغایرتی ماند، آن را مثل یک عدد در طیف ببینید، نه مثل یک بله یا خیر.

آخرین بازبینی: تیم تحریریه ملی ای‌پی‌آی

وب‌سرویس مرتبط با این راهنما

API تطابق درصدی اطلاعات هویتی

درصد شباهت نام، نام خانوادگی و نام پدر با ثبت احوال.

مشاهده مشخصات فنی و تعرفه

راهنماهای مرتبط

پرسش و تجربه کاربران

اگر این راهنما جوابتان را نداد، همین‌جا بپرسید. پرسش‌ها را تیمملی ای‌پی‌آی پاسخ می‌دهد و هر نظر پیش از انتشار بررسی می‌شود.

هنوز پرسشی ثبت نشده، اولین نفر باشید.