נתוני שמות לפי אזור הם המקום שבו עיצוב טופס שנראה ניטרלי מתגלה כעיצוב שנכתב עבור חלק אחד של העולם. ההנחה כמעט תמיד זהה: שלאדם יש שם פרטי ואחריו שם משפחה, בסדר הזה, באלפבית הלטיני, מופרדים ברווח. כל חלק במשפט הזה שקרי במקום כלשהו.
המדריך הזה עובר על ההבדלים המבניים שחשובים כאשר הנתונים נשמרים ולא רק מוצגים, ומסביר מה חבילת בדיקות חייבת להכיל לפני שאפשר לטעון ששדה שם הוא בינלאומי.
ממה מורכב שם משתנה
החלקים שמהם מורכב שמו האישי של אדם אינם אוניברסליים, וגם לא מספרם. הסדרים הנפוצים כוללים שם פרטי ושם משפחה, שם משפחה שנכתב לפני השם הפרטי, שם פרטי אחד או יותר בלי שם משפחה כלל, שם פרטי ואחריו שם אב שנגזר מהשם הפרטי של אחד ההורים, ושמות משפחה מורכבים שנכתבים עם רווח או עם מקף בין החלקים.
אף אחד מאלה אינו חריג לכלל; אלה פשוט כללים שונים. טופס שמנמק לפי השם הראשון והשם האחרון מצהיר על מבנה שחלק ניכר של העולם אינו נוהג לפיו, וההצהרה נכשלת בנקודה שבה משתמשים בנתונים ולא בנקודה שבה הם הוזנו: בברכה, בתווית משלוח, ברשימה ממוינת, ובאלגוריתם התאמה.
אילו שפות מציבות את שם המשפחה תחילה?
כמה שפות עושות זאת, וזו אינה קבוצה קטנה. מוסכמות השמות במזרח אסיה מציבות באופן מסורתי את שם המשפחה ראשון ואת השם הפרטי שני, והשפה ההונגרית נוהגת כך בתוך אירופה. כאשר שם כזה נרשם במערכת שמצפה לסדר ההפוך, שני החצאים מתחלפים, והחילוף בלתי נראה מפני ששני החצאים הם שמות אישיים סבירים.
הכשל נעשה חמור כאשר השם מותאם לרשומה אחרת או מודפס על מסמך. מכתב שנשלח לחצי הלא נכון של השם הוא מבוכה קטנה; מסמך זהות או רשומת בקרת גבול שמציגים סדר שם שגוי הוא קטגוריה אחרת לגמרי של בעיה, ואחת הסיבות לקיומם של תקנים בינלאומיים למסמכים קריאים במכונה.
הלקח המעשי הוא שהסדר הוא תכונה של הרשומה ולא תכונה של השדה. יש לשמור את החלקים באופן מוגדר, לשמור את האזור שקובע את סדרם, ולעצב לתצוגה ברגע האחרון ולא בנקודת ההזנה.
האם שמות בודדים לגיטימיים?
כן, וטופס שדורש שני שדות שם ידחה אדם אמיתי. שמות בודדים קיימים כשמות חוקיים בכמה מדינות ותרבויות, ומי שנושא אותם נתקל בכך כל הזמן: הטופס מתעקש על שם משפחה, ולכן הוא מקליד משהו, וכעת כל מסמך שהוא מושווה אליו חולק על הרשומה.
אותה תבנית מופיעה בצורות מתונות יותר. לאנשים מסוימים יש כמה שמות פרטיים ואין שדה שם אמצעי שמתאים להם. לאחרים יש שם משפחה שמורכב משתי מילים שמפרסר מבוסס רווחים יפצל. ולאחרים יש שמות באורך תו אחד, שנתקעים במגבלות אורך מזעריות שנכתבו כדי להרגיע ולא מסיבה אמיתית.
התיקון מבני ולא קוסמטי: יש לסמן את שדה השם השני כאופציונלי במדינות שבהן הוא אופציונלי, או טוב יותר, להתייחס לשם כולו כערך אחד עם שדות חלק אופציונליים שלעולם אינם נדרשים כברירת מחדל. האימות צריך לדחות את מה שבלתי אפשרי, ולא את מה שפשוט אינו מוכר.
מה קורה לשם באלפבית אחר?
שני דברים קורים, ולעיתים מבלבלים ביניהם. הראשון הוא תעתיק: המרה של שם הכתוב במערכת כתב אחת לאחרת, שהיא מיפוי שיש בו בחירות ממשיות ויותר ממוסכמה אחת מקובלת. השני הוא נרמול: ההחלטה אם שתי מחרוזות שנראות זהות הן באמת זהות, שהיא שאלה של אחסון והשוואה.
סימנים דיאקריטיים חשובים בשניהם. שם שנושא סימן מעל אות הוא מחרוזת שונה מאותו שם בלעדיו, והשאלה אם יש להתייחס אליהם כשווים תלויה במה שעושים עם הנתונים. התאמה בין שתי רשומות צריכה בדרך כלל להיות בלתי רגישה לסימנים; הדפסה של מסמך צריכה לעולם לא להסיר אותם. סידור לפי אלף בית הוא גם תלוי שפה, ולכן רשימה שממוינת לפי ברירת המחדל של השרת לא תהיה בסדר שהקורא של אותה שפה מצפה לו.
גם רישיות עדינה יותר מכפי שהיא נראית. המרה של שם לאותיות גדולות יכולה לשנות את אורכו בכמה שפות, ולמספר קטן של זוגות אותיות יש צורה גדולה שונה בהתאם לשפה. שדה שם שהופך לאותיות גדולות לצורכי תצוגה ושומר את התוצאה השמיד מידע שאינו יכול לשחזר.
בתעתיק לעברית נוצרת אותה בחירה שוב. שם לטיני כמו Müller נכתב בהקשרים עבריים בדרך כלל בלי הסימן שמעל האות, וזו בחירה של תעתיק ולא כלל גורף; אין צורה יחידה שנכונה בכל הקשר, ולכן כדאי לתעד את הבחירה ולשמור את הכתיב המקורי לצד התעתיק במקום להחיל אותה בשקט.
מדוע בעיות קידוד ממשיכות לצוף
שתי מחרוזות יכולות להיראות זהות על המסך ועדיין לא להיות שוות, מפני שתו עם סימן דיאקריטי יכול להיות מיוצג גם כתו אחד מורכב מראש וגם כתו בסיס ואחריו סימן משלים. שניהם תקפים, שניהם מוצגים אותו דבר, והשוואה ביניהם תו אחר תו מחזירה אי שוויון.
אותה בעיה מופיעה בכל פעם שטקסט עובר בין מערכות עם הנחות שונות לגבי משמעותו של מזהה. התיקון העמיד הוא נרמול בגבול: כאשר נתונים נכנסים, כאשר משווים אותם, וכאשר מייצאים אותם, תוך שימוש בצורה אחת מוסכמת ולא בזו שהגיעה במקרה.
זו גם הסיבה שחבילת בדיקות זקוקה לשמות שאינם לטיניים ולשמות עם סימנים דיאקריטיים. נתוני בדיקה שמורכבים כולם משמות לטיניים פשוטים יעברו כל בדיקה בזמן שנתוני הייצור ישברו שלוש מהן בשקט. רשומות ממחולל הזהות ונתוני הבדיקה נשלפות לפי מדינה ונושאות את מוסכמות השמות של אותה מדינה, מה שהופך אותן לנוחות לכיסוי מהסוג הזה; אלה שמות בדיוניים לצורכי בדיקה בלבד ואינם שייכים לאיש.
כיצד כדאי לפרוס שדות שם?
יש להתחיל מהשימוש בנתונים ולעבוד אחורה. רוב המערכות צריכות להציג שם, למיין שם ולחפש שם, ואף אחת מהפעולות האלה אינה דורשת שהשם יפוצל לשני חלקים בדיוק בנקודת ההזנה.
- שדה תצוגה אחד מחזיק את השם כפי שהוא אמור להיקרא, בסדר שהאזור של הרשומה קובע
- שדות חלק נפרדים הם אופציונליים ולעולם אינם נדרשים שניהם; טופס שמתעקש על שם משפחה אינו בינלאומי
- סימון אזור או כתב על הרשומה מאפשר לעיצוב ולמיון לבחור נכון בהמשך
- מגבלות האורך נדיבות, מפני ששמות אמיתיים ארוכים יותר מהדוגמאות בכל מפרט
- החיפוש נעזר בצורה המנורמלת, בעוד הערך השמור שומר על התווים המקוריים שלו
הפריסה הזאת עולה עמודה נוספת אחת ומסירה מחלקה שלמה של פגמים. היא גם מונעת מהשם להיות מעוצב מחדש בשקט על ידי השכבה הראשונה שנוגעת בו.
למפתחים: שדות, סדר והשוואה
יש למדל את השם כמבנה קטן עם בעלים ברור. יש לשמור את החלקים שהתקבלו, בתוספת הסדר שאליו הם שייכים, ולגזור את מחרוזת התצוגה לפי דרישה. אין לשמור את התוצאה של המרת רישיות או של הסרת סימנים דיאקריטיים; יש לשמור את המקור ולנרמל העתק לצורכי השוואה.
לצורכי נתוני בדיקה, יש לכסות את הצורות ששוברות הנחות במקום להוסיף עוד צורות שגרתיות: שם בודד, שם משפחה שמופיע ראשון, שם מורכב עם מקף, שם עם סימן דיאקריטי משולב, ושם באורך תו אחד. חמשת אלה תופסים את רוב הפגמים שמאה שמות שגרתיים לא יתפסו.
לאחר מכן יש לבדוק את שתי הפעולות שאנשים שוכחים. המיון צריך ללכת לפי האזור של הרשומה ולא לפי זה של המכונה, וקיצוץ צריך להיבדק מול השם הארוך ביותר שהנתונים באמת מכילים, מפני פריסה שמכילה כל דוגמה במפרט אינה ראיה שהיא מכילה את מסד הנתונים. כל שם בנתוני בדיקה מומצא לצורכי בדיקות תוכנה, ושום רשומה שמופקת בדרך הזאת אינה מזהה אדם אמיתי ואינה מייצגת אותו.
הצעדים הבאים
כדאי להפוך את שדה שם המשפחה לאופציונלי בטופס אחד השבוע ולראות אם משהו במורד הזרם תלוי בו; אם התשובה חיובית, התלות היא התקלה. לאחר מכן יש להפיק סט שמות בכמה אזורים במחולל הזהות ולהריץ אותם במסלולי התצוגה, המיון והחיפוש, ולבדוק שהמיון משתנה לפי האזור של הרשומה ולא לפי זה של השרת. המאמר על עקביות בין שדות מכסה את שאר הזוגות שהשמות האלה צריכים להסתדר איתם.