UTF-8

UTF-8 (ראשי תיבות של 8-bit Unicode Transformation Format או 8-bit UCS Transformation Format) הוא קידוד תווים באורך משתנה ליוניקוד, שנוצר על ידי רוב פייק וקן תומפסון. ניתן לקודד בו כל תו המצוי בתקן יוניקוד על ידי שימוש באחד עד ארבעה בתים, תלוי בתו. הקידוד ב-UTF-8 מעניק את כל יתרונות השימוש בקידוד ליוניקוד ומוסיף עליהם, בין היתר, גם חיסכון בזיכרון, עמידות בפני איבוד או השחתת בתים ותאימות לאחור ל-ASCII. ה-IETF מעדיף בבירור את UTF-8 ומחייב כל פרוטוקול אינטרנט לתמוך בו, וכן קונסורציום הדואר האלקטרוני, ה-IMC, ממליץ שכל תוכנת דואר אלקטרוני תוכל להציג וליצור דואר באמצעות UTF-8.

ההבדל בין יוניקוד ל-UTF-8

פרויקט יוניקוד החל כחלק ממאמץ ליצור מערכת תווים אחידה בינלאומית (באנגלית: UCS - Unified Character Set). בפשטנות גדולה ניתן לומר שיוניקוד הוא טבלה גדולה של תווים הממפה כל תו למספר המייצג אותו. יוניקוד אינו מפרט כיצד יש לייצג מספר זה במחשב. דרושה שיטה שבאמצעותה ניקח את המספר המייצג את התו ונשמור אותו במחשב בתור בית (או רצף של בתים). לשיטה זו אנו קוראים "קידוד תווים".
UTF-8 הוא קידוד תווים, הוא מורה לנו כיצד יש לקחת את המספר הייצוגי ולשמור אותו במחשב (וכיצד יש לקרוא מספרים השמורים במחשב ולהמירם למספרים ייצוגיים שלאחר מכן נוכל להמיר לתווים). אם ברשותנו טקסט ואנו מעוניינים להכניסו למחשב באמצעות קידוד יוניקוד, תחילה נחליף כל תו בטקסט למספרו הייצוגי לפי טבלת יוניקוד. כעת ברשותנו רצף של מספרים, באמצעות UTF-8 נשמור את המספרים הללו במחשב. UTF-8 מבוסס על יוניקוד בכך ששיטת השמירה שלו מבוססת על המספרים הייצוגיים שנקבעו ביוניקוד.
בעוד שקיים מיפוי אחד של תווים למספרים ייצוגיים בשם יוניקוד, קיימות דרכים רבות לשמור מספרים אלה במחשב, קרי, קיימים קידודי תווים רבים ליוניקוד. בהם UCS-2 ו-UCS-4 הפשוטים המורים לשמור את המספר באמצעות 2 או 4 בתים בהתאמה (קידודים אלה אינם בשימוש, שני בתים אינם מספיקים יותר לכל תווי יוניקוד ו-UCS-4 הפך ל-UTF-32) וכן גם קידודים מתוחכמים יותר כמו UTF-8 ו-UTF-16.

שימושים במערכות קיימות

UTF-8 הוא קידוד ברירת המחדל במערכות יוניקס ולינוקס.
שפת התכנות Java תומכת בקריאה וכתיבה של מחרוזות המקודדות ב-UTF-8, דרך המחלקות InputStreamReader ו-OutputStreamWriter. מאידך, למטרות של סיריאליזציה של אובייקטים, שימוש ב-Jave Native Interface ולשם הטמעת קבועים בקובצי class, משתמשת Java בגרסה קצת שונה של UTF-8 המכונה UTF-8 משופר (modified UTF-8). ישנם שני הבדלים בין UTF-8 התקני לזה המשופר. הראשון שבהם הוא שתו ה-NUL, שסימונו ביוניקוד U+0000, מקודד באמצעות שני בתים במקום בית אחד בצורה: 10000000 11000000. שינוי זה מבטיח שבעת קידוד המחרוזת לא יוטמעו בה תווי NUL וכך נפתרת בעיית עיבוד המחרוזות בשפות כמו שפת C המשתמשות בתו ה-NUL כסימון לסיום מחרוזת וכל תו NUL מוטמע יביא לחיתוך המחרוזת בטרם עת. ההבדל השני הוא בצורת קידודם של תווים מחוץ למשטח הרב-לשוני הבסיסי. ב-UTF-8 התקני, מקודדים תווים אלה באמצעות ארבעה בתים. ב-UTF-8 המשופר, תווים אלה מומרים קודם כל לצורה של זוגות ממלאי מקום (surrogate pairs), כמו ב-UTF-16 ואז כל אחד מבני הזוג מקודד לבדו והקידודים נכתבים ברצף, כמו ב-CESU-8. הסיבה להבדל זה מעודנת יותר. ב-Java, אורכו של משתנה מסוג תו הוא 16 סיביות. מסיבה זו, חלק מתווי יוניקוד דורשים שימוש בשני משתנים מסוג תו לשם ייצוג הולם. תכונה זו של השפה אינה תואמת את ההתקדמות ביוניקוד וההחלטה לפרוץ את גבולות המרחב הרב-לשוני הבסיסי, אך היא חיונית לשם ביצועים ולשם תאימות לאחור ולכן לא סביר שתשתנה. השימוש ב-UTF-8 משופר מבטיח שניתן יהיה לפענח מחרוזות מקודדות על ידי פיענוח של יחידת קוד של UTF-16 אחת בכל פעם ולא על ידי פיענוח מספר ייצוגי אחד של יוניקוד בכל פעם. השימוש ב-UTF-8 משופר גורם לכך שקידודם של תווים הדורשים ארבעה בתים כאשר משתמשים בצורה התקנית של UTF-8, דורש ב-UTF-8 המשופר שימוש בשישה בתים.
מערכת ההפעלה, Mac OS X, המיועדת למחשבי מקינטוש, מקודדת את שמות הקבצים במערכת הקבצים שלה על ידי שימוש ב-UTF-8 המותאם ליוניקוד מופרד קנונית. לעיתים מתייחסים לגרסה זו של UTF-8 כאל UTF-8-MAC. ביוניקוד, אם ברצוננו לייצג למשל את האות Ä (האות האנגלית הגדולה A עם שתי נקודות מעליה), נוכל להשתמש בתו היוניקוד U+00C4, שהוא בדיוק האות Ä. לחלופין, נוכל גם להשתמש בתו U+0041 שהוא התו A (האות האנגלית הגדולה A) ומיד לאחריו לשים את התו U+0308 שהוא הסימן הדיאקריטי שתי נקודות מעל לאות. בעיקרון תקן היוניקוד קובע חוקים לשילוב סימנים דיאקריטיים. קיימים בתקן תווים מיוחדים הנקראים תווים משלבים (combining characters). כתיבת אות ולאחריה תווים משלבים אמורים להוביל להצגת האות עם הניקוד. מטעמי תאימות לאחור ומסיבות אחרות, חלק מהאותיות עם הניקוד קיימות כתו נפרד ביוניקוד. תווים אלה נקראים תווים מורכבים מראש (precomposed characters) והתקן קובע גם לאילו תווים הם שקולים. יוניקוד מופרד, או מפורק, קנונית הוא יוניקוד שבו נאסר השימוש בתווים מורכבים מראש ולכן חייבים להשתמש בשילוב של אותיות וסימנים דיאקריטיים בכל מקום שבו נחוץ תו עם סימן דיאקריטי. השימוש ביוניקוד מופרד מקל רבות על הליכי מיון אך יוצר בלבול בקרב תוכנות המניחות שתווים מורכבים הם הצורה השכיחה ושילוב של תווים משלבים נעשה רק עבור צירופים מיוחדים. (זוהי דוגמה להגוון ה-NFD לנירמול טקסט). קיים דיון נרחב בנושא במסמך Apple Computer's Q&A 1173.