ממיר טקסט לבינארי
תרגום טקסט לבינארי — הבייטים שלו ב־UTF-8, שמונה ספרות לכל בייט — ובינארי בחזרה לטקסט, עם השורה והעמודה של תו שאינו במקומו.
11010111 10101001 11010111 10011100 11010111 10010101 11010111 10011101
איך טקסט הופך לאפסים ולאחדים
מחשב שומר טקסט כבייטים, ובייט הוא שמונה ביטים, שכל אחד מהם הוא 0 או 1. העמוד הזה מראה לכם את הבייטים האלה: הקלידו טקסט וכל בייט ייצא כשמונה ספרות בינאריות, עם רווח בין בייט לבייט שאחריו, או הדביקו בינארי וקראו את הטקסט שהוא מאיית. הוא עובד בשני הכיוונים, רץ כולו בדפדפן שלכם ונפתח על דוגמה שכבר הומרה.
מאילו בייטים טקסט מורכב תלוי בקידוד שלו, וכאן זה UTF-8 אלא אם תבחרו אחרת, כי UTF-8 הוא מה שדפי אינטרנט, כתובות URL ורוב קובצי הטקסט מחזיקים. הבורר «יחידה» קובע מה מייצגת קבוצה אחת של ספרות: בייט של UTF-8, בייט של UTF-16 באחד משני סדרי הבייטים, או נקודת קוד אחת. היחידה שבחרתם חלה על שני הכיוונים, והעמוד אף פעם לא משנה אותה בשבילכם. כשמה שאתם מדביקים נראה כמו יחידה אחרת, העמוד אומר זאת ומציב כפתור ליד ההערה, ושום דבר לא מתחלף עד שתלחצו עליו.
למה כל בייט נכתב בשמונה ספרות
ביט הוא ספרה בינארית אחת, ובייט הוא שמונה כאלה. לשמונה ביטים יש 256 צירופים אפשריים, ולכן בייט מחזיק מספר שלם מ־0, שהוא 00000000, עד 255, שהוא 11111111. בבייטים סופרים את הגודל של קבצים, של זיכרון ושל תעבורת רשת, ובכל מכונה שסביר שתפגשו בייט הוא שמונה ביטים; תקני רשת קוראים לו אוקטט, מילה שיכולה לציין רק שמונה.
ASCII תופס את 128 הערכים הראשונים מתוכם: הקוד של האותיות האנגליות, של הספרות ושל סימני הפיסוק הנפוצים, ו־128 ערכים צריכים רק שבעה ביטים. לכן הבייט של כל תו ASCII נפתח ב־0, ו־UTF-8 שומר את הבייטים שנפתחים ב־1 לכל מה שאין ב־ASCII. העמוד כותב כל בייט בכל שמונה הספרות שלו, כולל אפסים מובילים, גם מסיבה מעשית: בייטים ברוחב קבוע אחד אפשר לקרוא בחזרה בלי רווחים ביניהם, שמונה ספרות בכל פעם.
האות H, ביט אחר ביט
קחו H גדולה. ASCII נותן לה את המספר 72, ו־72 כבייט הוא 01001000. כשקוראים משמאל, שמונת המקומות שווים 128, 64, 32, 16, 8, 4, 2 ו־1, וכל 1 סופר את המקום שלו: לבייט הזה יש אחדים במקומות ששווים 64 ו־8, ו־64 ועוד 8 הם 72. האות i הקטנה היא 105, כלומר 64, 32, 8 ו־1, ולכן Hi יוצא 01001000 01101001.
רישיות היא ביט אחד. האות h הקטנה היא 01101000, הבייט של H כשהמקום ששווה 32 דולק, וכך גם כל אות באלפבית האנגלי, כי ASCII נותן לכל אות קטנה מספר גבוה בדיוק ב־32 מזה של האות הגדולה שלה.
הבורר «בסיס» כותב את אותו בייט בדרכים אחרות בלי לשנות אותו. כשנבחר «עשרוני», H היא 72; כשנבחר «הקסדצימלי», 48; וכשנבחר «אוקטלי», 110. זה בייט אחד שנכתב בארבע דרכים, והקריאה בחזרה לוקחת את הספרות בכל בסיס שבחרתם. ממיר טקסט להקסדצימלי נפתח על «הקסדצימלי», שבו בייט תופס שתי ספרות ולא שמונה.
למה אות שמעבר ל־ASCII תופסת שני בייטים או יותר
ASCII נגמר ב־127. לאות עם סימן דיאקריטי, לאות מהאלפבית הקירילי, העברי או הערבי, לתו יפני או קוריאני ולאמוג׳י יש נקודות קוד שמעבר לו, ו־UTF-8 כותב תו בבייט יחיד רק כשהוא ASCII, ושומר את הבייטים שנפתחים ב־1 לכל השאר. לכן כל אחד מאלה תופס שניים, שלושה או ארבעה בייטים, ובבינארי אפשר לראות את זה קורה, כי הביטים הראשונים של כל בייט אומרים איזה חלק של תו הבייט הוא:
- 0xxxxxxx הוא תו בבייט אחד: ASCII, ושבעת הביטים שלו כתובים במקום ה־x. למשל, H היא 01001000.
- 110xxxxx 10xxxxxx הוא תו בשני בייטים, לנקודות קוד עד 2,047, וזה מכסה את האותיות עם הסימנים הדיאקריטיים של השפות האירופיות ואת האלפביתים הקירילי, העברי והערבי. é היא 11000011 10101001 ו־א היא 11010111 10010000.
- 1110xxxx 10xxxxxx 10xxxxxx הוא שלושה בייטים, לנקודות קוד עד 65,535, ושם נמצאים הקאנה היפנית והקאנג׳י הנפוצים, האנגול הקוריאני וסימן האירו. € הוא 11100010 10000010 10101100.
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx הוא ארבעה בייטים, לכל נקודת קוד שמעבר לזה, ושם נמצאים רוב האמוג׳ים.
בייט ראשון שנפתח בשניים, שלושה או ארבעה אחדים אומר כמה בייטים יש לתו שלו, וכל בייט שממשיך תו נפתח ב־10, כך ששום בייט מאמצע של תו לא יכול להיחשב לתחילתו של תו. הסירו משני הבייטים של א את הסמנים, את ה־110 ואת ה־10, ואחד־עשר הביטים שנשארים, 10111010000, הם נקודת הקוד שלה, U+05D0, בבינארי. כשנבחר «הקסדצימלי» אותם שני בייטים נקראים D7 90, והדפוס מקופל לתוך הספרות; בבינארי הוא עומד בביטים הראשונים של כל בייט.
ארבעה בייטים לאמוג׳י אחד
😀 הוא U+1F600, הרבה מעבר ל־65,535, ולכן UTF-8 כותב אותו בארבעה בייטים: 11110000 10011111 10011000 10000000. הראשון נפתח בארבעה אחדים, ולכן הוא פותח תו של ארבעה בייטים, וכל אחד משלושת הבייטים שאחריו נפתח ב־10. נקודת הקוד שלו תופסת שבע־עשרה ספרות בינאריות, 11111011000000000, אחת יותר מהשש־עשרה שיש להן מקום בתו של שלושה בייטים; בדפוס של ארבעה בייטים יש מקום לעשרים ואחת.
אמוג׳י שנראה כמו סמל אחד יכול להיות כמה נקודות קוד, וכל אחת מהן נכתבת במלואה. יד מנופפת עם גוון עור היא שתי נקודות קוד ושמונה בייטים. משפחה של ארבעה היא שבע נקודות קוד, ארבעה אנשים ושלושת המחברים הבלתי נראים שביניהם, ועשרים וחמישה בייטים. הדביקו אחד כזה בעמוד וספרו את הקבוצות.
למה ממיר אחר מדפיס אחת־עשרה ספרות עבור א
ממיר שמדפיס אחת־עשרה ספרות עבור א, 10111010000, לא כתב את הבייטים שלה. הוא כתב את המספר שיוניקוד נותן לאות, נקודת הקוד שלה U+05D0, שהיא 1488, כמספר בינארי אחד, והמספר הזה אינו בייט של שום דבר שקובץ או רשת מחזיקים. הודעה שנכתבה כך יכול לקרוא בחזרה רק כלי שמניח את אותה הנחה.
שתי התשובות קרובות יותר ממה שנראה. אחת־עשרה הספרות הן בדיוק הביטים ש־UTF-8 פורש על פני שני הבייטים שלו אחרי שמסירים את הסמנים, כפי שהוצג למעלה, כך ששני הממירים כותבים את אותו מספר, ורק אחד מהם כותב את הבייטים שמאחסנים אותו. בתו ASCII השניים מסכימים חוץ מאפסים מובילים, ולכן הם נותנים את אותה תשובה לאנגלית פשוטה ונפרדים כמעט בכל השאר.
גם העמוד הזה נותן את התשובה הזאת, כיחידה שאתם בוחרים ולא כהנחה שלו: בחרו «נקודות קוד» ו־א תיכתב 10111010000, ותיקרא בחזרה באותה דרך. כש־UTF-8 נבחר, הדביקו הודעה שממיר של נקודות קוד כתב בעברית, ברוסית או ביפנית, והקבוצות רחבות מדי לבייטים; העמוד לא מנחש, אלא אומר שהקבוצות נראות כמו נקודות קוד ומציע את הכפתור «החלף לנקודות קוד». ממיר שעובד יחידת קוד אחת של UTF-16 בכל פעם, כמו ש־charCodeAt של JavaScript עושה, כותב את 😀 כשני מספרים בני שש־עשרה ספרות, שני החצאים של זוג הסורוגייטים שבו UTF-16 מאחסן אותו, והיחידה «נקודות קוד» קוראת את הזוג בחזרה כאמוג׳י האחד.
קריאת בינארי בחזרה כטקסט
כדי להפוך בינארי בחזרה לטקסט, העבירו את הכיוון אל «בינארי לטקסט» והקלידו או הדביקו את הספרות, והפלט הוא הטקסט שהן מאייתות. הכפתור «השתמש כקלט» עושה זאת בלחיצה אחת: הוא מעביר את הפלט אל הקלט והופך את הכיוון, וזו הדרך המהירה ביותר לבדוק המרה הלוך ושוב. כל אלה נקראים כאותם בייטים:
- רווח לבן מכל סוג, כולל מעברי שורה, ופסיקים, סימני נקודה־פסיק, נקודתיים או מקפים בין הבייטים.
- בלי מפרידים בכלל, בכל מקום שבו הספרות מתחלקות לבייטים שלמים של שמונה, וכך כותבת אותן האפשרות «רציף» שתחת «סגנון».
- קבוצות של שבע ספרות או פחות, שכך נראה תו ASCII שהאפס המוביל שלו הושמט: 1001000 1101001 נקרא Hi.
- הקידומת 0b לפני בייט, באות גדולה או קטנה, וזוג אחד של סוגריים מרובעים, מסולסלים או עגולים, או של מירכאות, סביב הכול.
אבל העמוד לא מנחש. כל תו אחר, או קבוצה ארוכה משמונה ספרות שאינה מתחלקת לבייטים שלמים, עוצרים את הקריאה, והעמוד אומר זאת ונוקב בשורה ובעמודה שבהן הקריאה נעצרה, והשורה שלכם עצמכם מוצגת מתחת עם המקום מסומן. בהודעה ארוכה זה ההבדל בין שגיאת הקלדה שאפשר למצוא לבין טקסט שגוי בשקט.
בינארי שנקרא כבייטים בלי בעיה אבל אינו טקסט UTF-8 מוצג ולא נדחה. הודעה שנקטעה באמצע תו חוזרת כשהרצף השבור מוצג כ־U+FFFD, תו ההחלפה, והערה מתחת לפלט אומרת כמה רצפים כאלה יש והיכן מתחיל הראשון שבהם: הבייט, הספרות שהדבקתם עבורו, והשורה והעמודה שלהן.
בינארי של טקסט, ובינארי של מספר
הקלידו כאן 5 והתשובה היא 00110101, לא 101. העמוד כותב את התו 5, ש־ASCII נותן לו את המספר 53, כי הספרות של טקסט הן הבייטים שמאחסנים אותו; 101 הוא המספר חמש כשהוא כתוב בבינארי, וזו שאלה אחרת עם תשובה אחרת. כך גם 255: כשמקלידים אותו כאן הוא שלושה תווים ושלושה בייטים, ואילו המספר 255 הוא בייט יחיד, 11111111.
כשמה שיש בידכם הוא מספר ולא טקסט, כמו ספירה, אוגר או ערך שתוכנית הדפיסה, ממיר בסיסי ספירה הוא המקום לקחת אותו אליו: הוא ממיר את הערך עצמו בין בינארי, אוקטלי, עשרוני, הקסדצימלי ובסיסים אחרים, וברוחב קבוע הוא כותב ערך שלילי במשלים ל־2 ומציג כל ביט כביט שאפשר ללחוץ עליו כדי להפוך אותו. העמוד הזה מתחיל מהתווים של טקסט; העמוד ההוא מתחיל ממספר.
שאלות נפוצות
- איך כותבים את השם שלי בבינארי?
- הקלידו אותו בתיבת הקלט, והוא ייצא בייט אחר בייט, שמונה ספרות לכל בייט ורווח בין בייט לבייט. Ada, למשל, היא 01000001 01100100 01100001. אות עם סימן דיאקריטי, או אות מאלפבית אחר, תופסת שני בייטים או יותר, ורווח בין שני שמות הוא בייט בפני עצמו, 00100000.
- כמה ביטים תופס תו אחד?
- ב־UTF-8, שמונה לאות, לספרה או לסימן פיסוק של ASCII, שש־עשרה לאות עם סימן דיאקריטי או לאות קירילית, עברית או ערבית, עשרים וארבעה לקאנה היפנית, לקאנג׳י הנפוצים, להאנגול הקוריאני ולסימן האירו, ושלושים ושניים לרוב האמוג׳ים. מה שנראה לכם כסמל אחד יכול להיות מתחת לפני השטח כמה נקודות קוד, וכל אחת מהן תופסת ביטים משלה.
- אפשר להדביק בינארי בלי רווחים בין הבייטים?
- כן, בכל מקום שבו הספרות מתחלקות לבייטים שלמים: שש־עשרה ספרות הן שני בייטים, ועשרים וארבע הן שלושה. קבוצה ארוכה משמונה ספרות שהאורך שלה אינו כפולה של שמונה אי אפשר לחלק בלי לנחש לאיזה בייט חסרה ספרה, ולכן היא נדחית בשורה ובעמודה שלה במקום להיקרא לא נכון.
- למה הטקסט שלי חוזר עם סימן שאלה בתוך מעוין?
- הסמל הזה הוא U+FFFD, תו ההחלפה, שהעמוד מציב בכל מקום שבו הבייטים אינם טקסט UTF-8: לרוב בייט אבד ותו נקטע, או שהבייטים מעולם לא היו UTF-8. במקום לדחות את ההודעה כולה, העמוד מציג כך כל רצף שבור, ואומר מתחת לפלט כמה יש כאלה והיכן מתחיל הראשון שבהם, כדי שתוכלו למצוא את הנזק במה שהדבקתם.
- למה ממיר אחר נותן לי בינארי אחר?
- ככל הנראה הוא כותב את נקודת הקוד של כל תו ולא את הבייטים שלו. השניים מסכימים ב־ASCII חוץ מאפסים מובילים, ונפרדים מעבר לו: א היא 11010111 10010000 כאן ו־10111010000 שם. בחרו «נקודות קוד» כדי לקבל את התשובה של הממיר ההוא, או כדי לקרוא בחזרה הודעה שהוא כתב.
- למה 5 אינו 101 כאן?
- כי 5 שמוקלד בתיבה הוא תו, והעמוד כותב את הבייט שמאחסן אותו, 00110101. המספר חמש הוא 101 בבינארי; למספר ולא לטקסט, השתמשו בממיר בסיסי ספירה.
- האם הטקסט שלי נשלח לשרת?
- לא. שני הכיוונים רצים כולם בדפדפן שלכם, כך שהטקסט שאתם מקלידים והבינארי שאתם מדביקים לעולם אינם עוזבים את המכשיר שלכם.
כלים קשורים
- ממיר בסיסי ספירה
הקלידו 5 בעמוד הזה ותקבלו את הבייט שבו נשמר התו 5, כלומר 00110101. העמוד ההוא נועד למספר ולא לטקסט: הוא ממיר את הערך עצמו, ולכן המספר חמש נכתב שם 101.
- ממיר טקסט להקסדצימלי
הקסדצימלי כותב בייט בשתי ספרות, במקום שבו בינארי צריך שמונה: Hi הוא 01001000 01101001 כאן, ובעמוד ההוא 48 69. כך דאמפ מציג בייטים, וכך קוד כותב אותם. גם העמוד הזה מציע הקסדצימלי, והעמוד ההוא נפתח עליו.
- Base64
קידוד ופענוח Base64 — תמיכה מלאה ב־UTF-8.
- מקודד / מפענח URL
קידוד אחוזים לערך בודד או לכתובת שלמה, ובחזרה.