char ויוניקוד
⚠ שימו לב - העמקה
זהו מסוגי הפוסטים שבהם אני נכנס מאוד לעומק בנושא שבדרך כלל אני עובר עליו מהר כשאני מעביר שיעורים פרונטליים. בדרך כלל הנושא שלהם מסתכם בכמה שקופיות במצגת פאוור פוינט, לפעמים אפילו שקופית אחת.
הפוסט מסתיים ברשימת נקודות עיקריות - להבין אותן זה מספיק.
בואו נתייחס מהר (יחסית) ל-char ונלמד על הטיפוס הזה. הוא לא מאוד חשוב לנו רוב הזמן אבל כדאי להכיר את הקונספט כי עשויים להתקל בו פעם בכמה זמן.
הדבר הראשון לדעת על char זה שהוא מייצג תו יחיד של טקסט. כלומר, טקסט מורכב מרצף של תווים. יש קטגוריות שונות של תווים: אותיות (בכל מיני שפות), ספרות, רווחים, סימני פיסוק, ליגטורות (לא משנה מה זה), אמוג’י (כלומר, אמוג’ים מסוימים; מסיבות טכניות שלא מעניינות אותנו, יש אמוג’ים שמכילים יותר מ-char אחד), ועוד. כמו שכדי לכתוב ב-Java “המספר $34$” אנחנו נכתוב בקוד “34”, יש דרך לכתוב “אני רוצה להתייחס לתו הספציפית הזה” ב-Java, וזה על ידי הקפת התו בגרש אחד מכל צד (גרש יחיד - לא להתבלבל עם מרכאות). הקוד הבא כולל המון דוגמאות:
char lowercaseA = 'a';
char uppercaseA = 'A';
char digit2 = '2';
char space = ' ';
char plus = '+';
char aleph = 'א';
char lowercaseMu = 'μ';
// this not an aleph - can you tell the difference?
char ligatureEl = 'ﭏ';
// yes, this really is just one character of text - try selecting it!
char salam = 'ﷵ';
char emoji = '☕';
אני ממש מקווה שרואים כאן את כל הדוגמאות כמו שצריך, למרות שאף פעם אי אפשר לקחת כמובן מאליו את זה שאפילו תו אחד שאינו אות אנגלית, ספרה, רווח או פיסוק, נראה בסדר בכל מערכת ממוחשבת שהיא.
אז זה היה הדבר הראשון לדעת על char. הדבר השני לדעת על char זה שזה קיצור של Character (שאת זה מבטאים “קָארַאקְטֵר”), ולא של Charizard, ולכן יש להגות את זה “קאר” ולא “צ’אר” ותפסיקו להגות את זה לא נכון.
יוניקוד (Unicode)
מאחורי הקלעים, char הוא מספר שלם. איזה מספר שלם? כל תו מתאים למספר שלם יחיד, והמספר שמתאים לתו נקרא ערך היוניקוד (Unicode) שלו. חפירת צד קצרה ולא חשובה:
- יוניקוד הוא תקן בינלאומי שמטרתו לקבוע, לכל המערכות הממוחשבות בעולם שמתעסקות בטקסט בצורה כזו או אחרת, אילו תווים קיימים ולאילו ערכים מספריים הם קיימים, בין אם ב-Java או ב-C, בווינדוס או בלינוקס, בישראל או ביפן
- צריך תקן כדי שנוכל לשתף מידע, כדי שכשאני כותב בצ’אט בתחילת המילניום את המילה “לא”, כולם יראו את המילה “לא” ולא איזה שהוא ג’יבריש. התקופה שלפני התקנים יצרה ביפנית את מילת הסלנג Mojibake שמשמעותה “טקסט שהמחשב שלי מציג בתור ג’יבריש או רעש אחר כי איפה שהוא בדרך משהו השתבש”. או במילים אחרו–‡å�—묠䫡壠ù䶬纭 촲𧠠ú 椬 䩩ú頮ö鲠��츠ù寠ùù嬧 쩠ຠ椠 ÷ö顠ù젱襣å�Œ.
- כל כמה זמן יוניקוד מוציאים את הגרסה הבאה של יוניקוד ומוסיפים כל מיני דברים מעניינים, כמו סימונים מתמטיים ואותיות משפות לא מוכרות אך חשובות (מה שנותן ייצוג להמון אנשים ומלהיב בלשנים), ולאף אחד לא אכפת, וכולם רק שואלים מה האמוג’ים החדשים (כן, יוניקוד הם גם האחראיים לאמוג’ים).
- פעם התקן היה ASCII, ויש אנשים שעדיין אומרים ASCII כשהם מתכוונים ליוניקוד (כולל אני - אני מנסה לזכור להגיד יוניקוד במקום ASCII כי זה יותר נכון, אבל, כוחו של הרגל - בהתחלה בכלל כתבתי את כל הפוסט הזה עם התייחסות ל-ASCII במקום ליוניקוד עד שנזכרתי)
ומה המספרים?
המספרים נקבעים בצורה הגיונית - כך שתווים שהגיוניים שיהיו ברצף, נמצאים ברצף. למשל, הנה לכם נתון - המספר 65 מייצג A גדולה. נחשו מה המספר 66 מייצג. יש שני ניחושים הגיוניים - 99% ינחשו “B גדולה” ו-1% ינחשו “a קטנה”. ה-99% צודקים - המספרים 65-90 (כולל) מייצגים את האותיות הגדולות באנגלית, והמספרים 97-122 (כולל) מייצגים את האותיות הקטנות באנגלית - בשני המקרים לפי הסדר. זה נכון גם לגבי אלפביתים אחרים (אבל בקטע מוזר, לגבי עברית, הסדר של האותיות הוא “אבגדהוזחטיךכלםמןנסעףפץצקרשת” - כלומר, באופן קצת מעצבן, האותיות הסופיות םןץףך לא מוקמו ברצף אחרי ת’ וגם לא אחרי האותיות הלא-סופיות שלהן אלא לפני. ניחא).
הספרה 0 לא מיוצגת על ידי המספר 0 (יש לזה סיבות שלא מעניינות אותנו), אלא על ידי 48, ואחריה באות שאר הספרות, כלומר 49 מייצג את הספרה 1 וכן הלאה עד 57 שמייצג את הספרה 9.
ומה זה אומר בשביל Java
אוקיי, אז תווים מיוצגים על ידי מספרים מאחורי הקלעים, האם אכפת לנו? לפעמים. בין השאר, אנחנו יכולים לבצע קאסטינג בין int ל-char ולהפך:
char aleph = 'א';
int toInt = (int) aleph;
char backToChar = (char) toInt;
אנחנו גם יכולים לעשות פעולות חשבוניות עם תווים, בפרט חיבור וחיסור:
char lowercaseZ = 'Z' + ('a' - 'A');
נסו לחשוב למה אם יש לנו אות גדולה, להוסיף את הערך המספרי של a ולחסר את זה של A ייתן לנו את האות הקטנה המתאימה לה.
נקודות עיקריות
- char מייצג תו יחיד של טקסט (קיצור של character ולכן יש להגות “קאר”)
- מאחורי הקלעים, char מיוצג על ידי מספר שלם
- תקן בשם יוניקוד (בכל שפות התכנות וכל המחשבים) מה המספר של כל תו.
- ניתן לבצע המרה בשני הכיוונים – int ל-char ולהפך
- רצפים אלפביתיים נמצאים ברצף לפי הסדר שלהם. למשל, A גדולה = 65 ולכן B גדולה = 66 וכו’.
- ניתן לחבר int ל-char ולקבל char.
Comments