מהו קידוד תווים
קידוד הוא הסכם: «המספר 65 מייצג את האות A». כשכותבים טקסט, התוכנה שומרת את המספרים האלה; כשאדם אחר פותח אותו, התוכנה שלו מתרגמת אותם בחזרה לאותיות לפי אותו הסכם. אם שני הצדדים לא משתמשים באותה טבלה, הטקסט יוצא שבור.
צריך להבחין בין שני רעיונות. האחד הוא קבוצת התווים, הרשימה של איזה מספר מתאים לאיזה סימן. השני הוא איך המספרים האלה נשמרים בבתים. ב-ASCII השניים חופפים באופן טריוויאלי; ביוניקוד לא, ושם נכנס UTF-8.
ASCII: 128 תווים של 7 ביטים
ASCII (ראשי תיבות של American Standard Code for Information Interchange) תוקנה בשנות ה-60. היא משתמשת ב-7 ביטים, כלומר 2 בחזקת 7 = 128 קודים, מ-0 עד 127. מתוכם 33 הם תווי בקרה (מ-0 עד 31 ו-127) ו-95 ניתנים להדפסה (מ-32 עד 126, כולל הרווח).
היא לא כוללת אותיות עם סימנים, לא את ñ ולא את סימן האירו: היא תוכננה לאנגלית. זה מסביר למה אחר כך נדרשו טבלאות אחרות.
| תו בקרה | עשרוני | הקסדצימלי | בינארי (7 ביטים) | למה משמש |
|---|---|---|---|---|
| ריק (NUL) | 0 | 00 | 0000000 | מסמן סוף מחרוזת בכמה שפות |
| טאב אופקי (TAB) | 9 | 09 | 0001001 | קופץ לעצירת הטאב הבאה |
| ירידת שורה (LF) | 10 | 0A | 0001010 | יורד לשורה הבאה |
| החזרת סמן (CR) | 13 | 0D | 0001101 | חוזר לתחילת השורה |
| בריחה (ESC) | 27 | 1B | 0011011 | פותח רצפי בקרה |
| רווח | 32 | 20 | 0100000 | התו הראשון הניתן להדפסה |
| מחיקה (DEL) | 127 | 7F | 1111111 | מוחק את התו |
קשרים שכדאי לזכור
הטבלה לא מסודרת באקראי. עם כמה חוקיות אפשר לקרוא קודים מהזיכרון.
- הספרות «0» עד «9» תופסות את 48 עד 57 (30 עד 39 בהקסדצימלי). הערך של ספרה הוא הקוד שלה פחות 48: «7» הוא 55, ו-55 − 48 = 7.
- האותיות הגדולות נעות מ-65 («A») עד 90 («Z») והקטנות מ-97 («a») עד 122 («z»).
- ההפרש בין אות גדולה לקטנה שלה הוא תמיד 32: «A» = 65 ו-«a» = 97; «C» = 67 ו-«c» = 99. בבינארי משתנה ביט אחד בלבד: 01000001 ל-«A» ו-01100001 ל-«a».
- כדי לדעת איזה מקום באלפבית תופסת אות גדולה, הפחיתו 64: «C» היא 67 ו-67 − 64 = 3, האות השלישית.
- מכיוון שכל האותיות הגדולות (65 עד 90) בעלות קודים נמוכים מהקטנות (97 עד 122), מיון אלפביתי «לפי קוד» שם את «Zebra» לפני «apple». תוכנות רבות זקוקות לאפשרות השוואה נפרדת כדי למיין נכון.
סוף שורה: LF, CR ו-CRLF
ירידת שורה נראית דבר פשוט, אבל היא נכתבת אחרת בכל מערכת. יוניקס, לינוקס ו-macOS משתמשות בתו אחד, LF (10). ווינדוס משתמשת בשניים ברצף, CR ו-LF (13 ו-10), הידועים כ-CRLF. לטלפרינטרים הישנים היו נחוצות שתי פקודות שונות: להחזיר את המרכבה לתחילת השורה ולקדם את הנייר שורה אחת.
ההבדל הזה הוא הסיבה לקבצים שנראים כולם בשורה אחת בעורך בסיסי, או עם סימן מוזר בסוף כל שורה. אם אתם רוצים לדעת איזה קוד יש לכל אחד, כתבו LF או CR בחיפוש של טבלת ASCII.
«ASCII מורחב» אינו תקן
מכיוון שלבייט יש 8 ביטים ו-ASCII משתמשת רק ב-7, נשארו 128 קודים פנויים (מ-128 עד 255) וכל יצרן ואזור מילא אותם בדרכו. זה מכונה «ASCII מורחב», אבל אין טבלה אחת: יש רבות, שנקראות דפי קוד. שניים מהמוכרים הם Latin-1 (ISO-8859-1), שבו é הוא הקוד 233, ו-Windows-1252, דומה אבל עם הבדלים בקודים 128 עד 159 (שם נמצא, למשל, האירו).
הבעיה היא שהקוד 233 מייצג «é» בטבלה אחת ודבר אחר באחרת. טקסט שנכתב עם טבלה אחת ונקרא עם אחרת הציג ג׳יבריש. יוניקוד נולדה כדי לסיים את הבלגן הזה.
יוניקוד ו-UTF-8
יוניקוד מקצה מספר ייחודי, שנקרא נקודת קוד, לכל תו של כמעט כל מערכות הכתב בעולם, ובנוסף סימנים ואמוג׳י. כיום יש בה יותר מ-150,000 תווים. היא נכתבת עם הקידומת U+ ובהקסדצימלי: «A» היא U+0041, «ñ» היא U+00F1, האירו הוא U+20AC ואמוג׳י הפרצוף המחייך הוא U+1F600. 128 נקודות הקוד הראשונות הן בדיוק אלה של ASCII.
UTF-8 היא הדרך הנפוצה ביותר לשמור את המספרים האלה בבתים, והיא משתמשת בין 1 ל-4 לפי התו. 128 התווים של ASCII תופסים בייט אחד זהה לזה שתמיד, ולכן טקסט ASCII הוא גם טקסט UTF-8 תקין. השאר תופס יותר בתים.
| תו | נקודת קוד | בתים ב-UTF-8 | בתים (הקסדצימלי) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ñ | U+00F1 | 2 | C3 B1 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
למה מופיע «Ã±» במקום «ñ»
זו הטעות הנפוצה ביותר ויש לה הסבר מדויק. ñ ב-UTF-8 היא שני בתים: C3 ו-B1. אם תוכנה סבורה שהטקסט הוא ב-Latin-1, היא קוראת כל בייט כתו: C3 הוא «Ã» ו-B1 הוא «±». התוצאה: «Ã±». אותו דבר קורה עם «é», שנראית כמו «Ã©», ועם «café», שמופיעה כ«café».
הפתרון כמעט תמיד הוא להורות לתוכנה לפתוח את הקובץ כ-UTF-8 (בעורך טקסט או בהגדרות הייבוא של גיליון אלקטרוני). כשזה קורה בכיוון ההפוך, טקסט ב-Latin-1 שנקרא כ-UTF-8, מופיעים בדרך כלל מעוינים עם סימן שאלה, כי הבתים הבודדים האלה לא יוצרים רצפי UTF-8 תקינים.
איך משתמשים בטבלת ASCII ובממיר
הכלי «טבלת ASCII» מציג את 128 התווים עם הקוד שלהם בעשרוני, בהקסדצימלי, באוקטלי ובבינארי, ואת שם תווי הבקרה.
- הקלידו בחיפוש תו, קוד או שם של תו בקרה (למשל A, 65, 41 או LF) כדי למצוא את השורה שלו.
- השתמשו בכפתורי הסינון (בקרה, ספרות, אותיות גדולות, אותיות קטנות, סימנים) כדי לראות רק קבוצה אחת.
- כדי להמיר, כתבו טקסט ב«טקסט» ובחרו את הפורמט (עשרוני, הקסדצימלי, אוקטלי או בינרי): למטה מופיעים הקודים. «Hola» נותן 72 111 108 97 בעשרוני ו-48 6F 6C 61 בהקסדצימלי.
- אפשר גם בכיוון ההפוך: הדביקו קודים מופרדים ברווחים או בפסיקים ב«קודים» והטקסט נבנה. בהקסדצימלי מתקבלות גם קידומות כמו 0x41.
אם בטקסט יש תווים שאינם ASCII, כמו האות א, הכלי מתריע ומציג את קוד היוניקוד שלהם. כדי לראות את הבתים האמיתיים ב-UTF-8 השתמשו ב«טקסט לבינארי»: האות א נותנת 11010111 10010000, שני בתים של 8 ביטים. המגבלות: הטבלה מציגה רק ASCII תקנית ולא מורחבת, והכול מחושב בדפדפן שלכם בלי לשלוח את הטקסט לאף שרת.
שאלות נפוצות
כמה תווים יש ב-ASCII?
128, עם קודים מ-0 עד 127 ו-7 ביטים לכל אחד. מתוכם 33 הם תווי בקרה ו-95 ניתנים להדפסה, כולל הרווח.
מהו קוד ה-ASCII של האות A ושל a?
«A» היא 65 (41 בהקסדצימלי, 01000001 בבינארי) ו-«a» היא 97 (61 בהקסדצימלי, 01100001 בבינארי). ההפרש ביניהן תמיד 32.
מה ההבדל בין ASCII ליוניקוד?
ל-ASCII יש 128 תווים שנועדו לאנגלית. ליוניקוד יש יותר מ-150,000, מכמעט כל השפות וגם אמוג׳י, ו-128 הראשונים שלה זהים לאלה של ASCII.
מהו UTF-8?
זו הדרך הנפוצה ביותר לשמור טקסט יוניקוד בבתים. היא משתמשת ב-1 עד 4 בתים לתו: תווי ASCII תופסים אחד, אות בעברית תופסת שניים ואמוג׳י ארבעה.
למה הטקסט שלי מציג «Ã±» או «Ã©»?
כי טקסט ששמור ב-UTF-8 נקרא כ-Latin-1. פתחו את הקובץ תוך ציון קידוד UTF-8 וזה יסתדר.