כדי שמחשב יוכל לאחסן טקסט ומספרים שבני אדם יכולים להבין, צריך להיות קוד שהופך תווים למספרים. תקן Unicode מגדיר קוד כזה באמצעות קידוד תווים.
הקידוד של תו הסיבה כה חשוב הוא כך שכל מכשיר יכול להציג את אותו מידע. ערכת קידוד תווים מותאמת אישית עשויה לעבוד בצורה מבריקה על מחשב אחד, אך בעיות יתרחשו כאשר תשלחו את אותו טקסט למישהו אחר. הוא לא יידע על מה אתה מדבר אלא אם כן הוא מבין את תוכנית הקידוד.
קידוד תווים
כל קידוד התווים שעושה הוא להקצות מספר לכל תו שניתן להשתמש בו. אתה יכול ליצור קידוד תו ברגע זה.
לדוגמה, יכולתי לומר שהמכתב א הופך למספר 13, a = 14, 1 = 33, # = 123 וכן הלאה.
כאן נכנסים סטנדרטים כלל-ענפיים. אם כל ענף המחשבים משתמש באותה תוכנית קידוד תווים, כל מחשב יכול להציג את אותן התווים.
מה זה יוניקוד?
ASCII (קוד תקן אמריקאי להחלפת מידע) הפך לתכנית הקידוד הנפוצה הראשונה. עם זאת, זה מוגבל ל 128- תווים בלבד. זה בסדר מבחינת התווים, המספרים והניקוד האנגלית הנפוצים ביותר, אבל זה קצת מגביל עבור שאר העולם.
באופן טבעי, שאר העולם רוצה את אותה תוכנית קידוד גם לדמויות שלהם. עם זאת, למשך זמן קצר, אך תלוי היכן היית, יכול להיות שהוצגה תו שונה עבור אותו קוד ASCII.
בסופו של דבר, חלקי העולם האחרים החלו ליצור תוכניות קידוד משלהם, והדברים התחילו להיות מעט מבלבלים. לא רק תוכניות הקידוד באורכים שונים, תוכניות היו צריכות להבין באיזו תוכנית קידוד הם היו אמורים להשתמש.
התברר כי היה צורך בתוכנית קידוד תווים חדשה, וזה היה כאשר נוצר תקן Unicode. מטרת יוניקוד היא לאחד את כל תוכניות הקידוד השונות כך שניתן יהיה להגביל את הבלבול בין מחשבים ככל האפשר.
בימינו, תקן Unicode מגדיר ערכים של מעל 128,000 תווים וניתן לראות אותם ב- קונסורציום יוניקוד. יש לו כמה צורות קידוד תווים:
- UTF-8: רק משתמש בייט אחד (8 סיביות) לקידוד תווים באנגלית. זה יכול להשתמש ברצף של בתים כדי לקודד תווים אחרים. UTF-8 נמצא בשימוש נרחב במערכות דוא"ל ובאינטרנט.
- UTF-16: משתמש בשני בתים (16 סיביות) לקידוד התווים הנפוצים ביותר. במידת הצורך, ניתן לייצג את התווים הנוספים על ידי זוג של מספרים של 16 סיביות.
- UTF-32: משתמש בארבעה בתים (32 סיביות) לקידוד התווים. התברר שככל שגדל התקן של יוניקוד, המספר של 16 סיביות קטן מכדי לייצג את כל הדמויות. UTF-32 מסוגל לייצג כל תו Unicode כמספר אחד.
הערה: UTF פירושו יחידת טרנספורמציה Unicode.
נקודות קוד
נקודת קוד היא הערך שניתן תו בתקן Unicode. הערכים לפי יוניקוד כתובים כמספרים הקסדצימליים ויש להם קידומת של U +.
לדוגמה, כדי לקודד את הדמויות בהן הסתכלנו קודם:
- א הוא U + 0041
- א הוא U + 0061
- 1 הוא U + 0031
- # הוא U + 0023
נקודות קוד אלה מחולקות ל 17 חלקים שונים הנקראים מטוסים, המזוהים על ידי המספרים 0 עד 16. כל מטוס מחזיק 65,536 נקודות קוד. המטוס הראשון, 0, מכיל את התווים הנפוצים ביותר וידוע בשם המטוס הבסיסי הרב-לשוני (BMP).
יחידות קוד
תוכניות הקידוד מורכבות מיחידות קוד המשמשות לספק אינדקס למקום בו תו ממוקם על מטוס.
ראו דוגמה ל- UTF-16. כל מספר 16 סיביות הוא יחידת קוד. ניתן להפוך את יחידות הקוד לנקודות קוד. למשל, לסמל התו השטוח ♭ יש נקודת קוד של U + 1D160 והוא חי במישור השני בתקן Unicode (המטוס האידיאוגרפי המשלים). זה יהיה מקודד באמצעות שילוב של יחידות קוד 16 סיביות U + D834 ו- U + DD60.
עבור ה- BMP הערכים של נקודות הקוד ויחידות הקוד זהים. זה מאפשר קיצור דרך עבור UTF-16 שחוסך שטח אחסון רב. הוא צריך להשתמש רק במספר 16 סיביות אחד כדי לייצג את התווים האלה.
כיצד Java משתמשת ב- Unicode?
ג'אווה נוצר סביב התקופה בה התקן Unicode הגדיר ערכים עבור קבוצת תווים קטנה בהרבה. באותה תקופה הורגש כי 16 סיביות יהיו די והותר לקודד את כל הדמויות שתידרש אי פעם. עם זאת, Java תוכננה להשתמש ב- UTF-16. סוג נתוני ה- char שימש במקור לייצוג נקודת קוד Unicode עם 16 סיביות.
מאז Java SE v5.0, ה- char מייצג יחידת קוד. זה לא משנה מעט בייצוג תווים שנמצאים במישור הבסיסי הרב לשוני מכיוון שערך יחידת הקוד זהה לנקודת הקוד. עם זאת, זה אומר שעבור הדמויות שבמטוסים האחרים, יש צורך בשני תווים.
הדבר החשוב לזכור הוא שסוג נתוני char יחידה כבר לא יכול לייצג את כל התווים של Unicode.