מה האורך של דגל ישראל ב 2022
למרות שעשינו התקדמות משמעותית בכל מה שקשור לטיפול ביוניקוד בשפות תכנות, פוסט שעלה לאחרונה לרדיט הזכיר לי שלא הכל ורוד ושגם ב 2022 רוב שפות התכנות שנעבוד איתן ידרשו טיפול מיוחד בשביל לחשב נכון אורך של מחרוזת. הנה סקירה זריזה שעשיתי בעקבות אותו פוסט כדי להבין מה האורך של דגל ישראל בשפות תכנות שונות שאני מכיר.
1. ג'אווהסקריפט
אז מילה של הקדמה - כשאני שואל על דגל ישראל אני בעצם מדבר על האימוג'י של הדגל שאתם מכירים מהווטסאפ. ב HTML אפשר להדפיס אותו בעמוד עם הקוד:
<span>🇮🇱</span>
כמו הרבה דגלים הוא מורכב משני Unicode Codepoints, הראשון מייצג את "סימן אזורי I" והשני "סימן אזורי L". בני אדם שרואים את האימוג'י הזה מתיחסים אליו בתור תו אחד, ובשפה מקצועית זה נקרא Grapheme אחד. הרבה אימוג'ים אחרים (שאינם דגלים) מיוצגים על ידי Codepoint יחיד, ומה שמעניין בדגלים זה שהם מראים לנו את ההבדל בין Codepoints ל Graphemes. קודפוינט ביוניקוד זה פשוט תו יוניקודי יחיד, וגרפמה זה מה שאנחנו כבני אדם תופסים בתור תו אחד.
שפת התכנות הראשונה שרציתי לבדוק איך היא מטפלת בגרפמות היא ג'אווהסקריפט פשוט כי קוד JavaScript נראה לי כמו משהו שבסבירות גבוהה יפגוש אימוג'ים. אז כתבתי את התוכנית הבאה:
console.log("🇮🇱".length);
וניסיתי להריץ אותה גם ב node וגם בכרום. התוצאה בשני המקומות היתה זהה - המספר 4.
כשניסיתי לשאול את גוגל אם יש דרך לספור גרפמות ב JavaScript הוא לא ידע להמליץ לי על דרך מובנית בשפה, אבל כן שלח אותי לספריה הזאת: https://github.com/orling/grapheme-splitter שנראה שיודעת לספור כמו שצריך.
2. פייתון
בפייתון המצב קצת יותר טוב. התוכנית שכתבתי נראית כך:
print(len("🇮🇱"))
והפעם התוצאה היתה 2. עדיין לא מדויק אבל לפחות קצת יותר קרוב לאורך האמיתי.
גם כאן גוגל לא ידע להציע לי דרך נוחה ומובנית בשפה לספור גרפמות, ובמקום שלח אותי לספריה הזאת https://pypi.org/project/grapheme/ שנראה שמצליחה להתמודד עם האתגר.
3. רובי
גם ברובי הניסיון הראשון שלי לקבל את האורך החזיר 2:
puts "🇮🇱".length
אבל הפעם גוגל כבר ידע לספר שאני פשוט לא מפעיל את הפונקציה הנכונה, והדרך האמיתית לספור גרפמות במחרוזת ברובי היא פשוט:
puts "🇮🇱".grapheme_clusters.length
וזה כבר מחזיר את התוצאה הנכונה - כלומר 1.
4. פרל
בשביל לסיים את סבב "שפות הסקריפטים" חשבתי לנסות לראות מה המצב בפרל. נכון, מזמן לא כתבתי בה, אבל זה כמו לרכב על אופניים או משהו. בקיצור הגירסה הראשונה שכתבתי בפרל המשיכה את המסורת של פייתון ורובי והחזירה 2:
use v5.30;
use utf8;
say(length("🇮🇱"));
אבל בניגוד לפייתון, בפרל מודול הביטויים הרגולאריים מספיק משוכלל כדי לספור גרפמות עם התו המיוחד \X
(להגנת פייתון צריך להגיד שיש ספריה חיצונית בשם regex שכן מספקת את ההתנהגות הזאת גם שם). בכל מקרה הקוד הזה בפרל כבר הדפיס את התוצאה הנכונה:
my $str = "🇮🇱";
my $count = 0;
while ($str =~ /\X/g) { $count++ }
say($count);
קצת יותר ארוך מרובי אבל עדיין מספיק טוב בעיניי.
5. אליקסיר
שתי השפות האחרונות לסקירה הן אלה שעושות את הדבר הנכון מההתחלה. באליקסיר, הפקודה String.length מחזירה את האורך בגרפמות, ולכן התוכנית הבאה מדפיסה 1:
String.length("🇮🇱")
|> IO.inspect
6. סוויפט
ואותו המשחק קורה בסוויפט, כשהפונקציה count הרגילה לחישוב אורך מדפיסה את הדבר הנכון בלי לעשות עניינים:
print("🇮🇱".count)
אם נסכם - גם ב 2022 הרבה שפות תכנות פופולריות מכריחות אתכם להתקין ספריה חיצונית או להשתמש בקוד מיוחד כדי לספור כמו שצריך כמה תווים יש במחרוזת. קשה לי לראות את זה משתנה בעתיד הקרוב מטעמי תאימות אחורה ולכן האחריות בידיים שלנו. שימו לב באיזו שפה אתם עובדים ואיזה טיפול מיוחד נדרש בעבודה עם מחרוזות.