UTF-16

UTF-16 הוא קידוד של כל תו יוניקוד באמצעות קבוצה אחת או שתיים של 16 סיביות, כלומר 2 או 4 בתים לכל תו, בהתאם לתו. את רוב התווים מקודדים ב־16 סיביות, ורק תווים נדירים והיסטוריים מקודדים ב־32 סיביות.

רקע 

ב־1990, כאשר הוחל בתקינת תקן יוניקוד לקידוד תווים אחיד, עלה במחשבה כי אין צורך אלא בהרחבת הקידוד לכל תו מבית אחד (8 סיביות) ל־2 בתים (16 סיביות). קידוד כזה נותן מקום ל־65,536 תווים, והמייסדים של יוניקוד סברו כי מספר זה יספיק. תוכנן כי אותיות עם אקצנטים והברות קוריאניות יקודדו באמצעות יסודות מתחברים (combining characters), דבר שיחסוך במקומות, וכי תווים היסטוריים (כגון גותית ואוגריתית) יקודדו בתוך אזור השימוש הפרטי (private use area) של יוניקוד, במקומות U+A000 עד U+FAFF (מספרים הקסדצימליים). כך היה המצב בגרסה 1 של תקן יוניקוד.

ברם, כעבור כמה שנים השתנו הדברים תכלית שינוי. לצורך תאימות לאחור הוחלט על הקצאת מקומות לתווים מחוברים, כלומר במקום לקודד את האות ē כשני תווים, האות e ולאחריה קו עליון מתחבר, לקודד את כל הסימן הזה כתו אחד. כך עלה הצורך להקצות אלפי קודים לקידוד ההברות הקוריאניות (אשר הועברו למקומות U+AC00 עד U+D7FF, ואזור השימוש הפרטי הועבר ל־U+D800 עד U+FAFF), והתחזיות לשימוש העתידי של קידוד 16 סיביות התבדו. מתכנני יוניקוד הבינו כי 65,536 תווים אינם מספיקים לכל הצרכים, וכך נולד UTF-16, שהוא הרחבה של גרסה 1 של יוניקוד.

תיאור הקידוד 

UTF-16 פועל כך: ב־2,048 = 1,024 + 1,024 תווים מתוך ה־65,536 הראשונים משתמשים למיעון 1024×1024, כלומר 1,048,576, תווים נוספים. הקודים האלה הם U+D800 עד U+DBFF לחצי הראשון ו־U+DC00 עד U+DFFF לחצי השני. צירוף של קוד מהחצי הראשון ולאחריו קוד מהחצי השני משמש למיעון תו יוניקוד מעבר ל־U+FFFF, כלומר מ־U+10000 עד U+10FFFF. למשל, הצירוף D84C DFB4 ממען את התו U+233B4 (שהוא סימן סיני נדיר). מנגנון זה נקרא מנגנון ממלאי המקום או באנגלית surrogates.

תחת קידוד זה, יוניקוד מגרסה 2 ואילך יכול להכיל 1,112,064 תווים, די והותר לכל שימוש עתידי.

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

בקידוד UTF-16 משתמשים מערכות Windows (החדשות יותר – NT ו־2000 ו־XP) ומצע Java. אלה השתמשו במקור ביוניקוד המקורי של 16 סיביות ועברו ל־UTF-16 לאחר מכן. ב־Windows ניתן לאחסן קובצי טקסט בקידוד UTF-16 או UTF-8, אך בזיכרון יימצא הטקסט תמיד כ־UTF-16. ב־Windows הבתים יופיעו בסדר little-endian, בשל השימוש של מעבדי אינטל בסדר זה, ואילו ב־Java הם יהיו בסדר big-endian.

השפעה על קידודי יוניקוד האחרים 

קידוד UTF-8 יכול למען בעיקרון עד 2,147,483,647 תווים, עד U+7FFFFFFF. תקן ISO 10646, שהיה תחילה נפרד מיוניקוד אך אוחד איתו אחר־כך, מכיל צורת קידוד של 32 סיביות לכל תו היכולה למען מספר זהה לזה של UTF-8. ואולם, כאשר UTF-16 פורסם, הוחלט כי תקני יוניקוד ו־ISO 10646 יגבילו את תחום התווים עד לתחום האפשרי של UTF-16, כלומר עד U+10FFFF. כתוצאה מכך, צורות הקידוד האחרות של יוניקוד, UTF-8 (אחד עד ארבעה בתים לכל תו) ו־UTF-32 (ארבעה בתים לכל תו), מוגבלות בגרסאות הנוכחיות של יוניקוד למיעון של קצת יותר ממיליון תווים, על אף שהן יכולות באופן עקרוני למען למעלה משני מיליארד תווים.

קידוד תווים