אלגוריתם דו-כיווניות של יוניקוד

**אלגוריתם דו-כיווניות של [[יוניקוד]]** מאפשר קביעת כיוון זרימת מלל במערכות מחשב, מימין לשמאל או משמאל לימין.

כדי לעמד מלל דו-כיווני כהלכה משתמש האלגוריתם בנתון סוג הכיווניות של תווים כדי לנתח את הטקסט ולפרק אותו לקטעים או רצפים של תווים, בעלי כיווניות מסוימת. לכל תו ניתן לקבוע כיווניות חזקה ימין-לשמאל, חזקה שמאל-לימין, חלשה ימין לשמאל, חלשה שמאל-לימין, ונייטרלי. באלגוריתם, תווים מטווח יוניקוד לעברית, ערבית, אשורית ודומותיהן נחשבים בעלי כיווניות ימין-לשמאל חזקה. תווי האלף-בית הלטיני נחשבים בעלי כיווניות שמאל-לימין חזקה. תווי מספרים נחשבים בעלי כיווניות שמאל-לימין חלשה. תווי פיסוק וניקוד נחשבים נייטרליים מבחינת כיוונם.

## תווים נייטרליים
בהכללה, קובע האלגוריתם את כיווניותם של תווים נייטרליים בהתאם להקשר שבו הם נמצאים: אם הם נמצאים בין שני תווים בעלי כיווניות חזקה אחת, הם יירשו אותה. לדוגמה, כאשר תווי פיסוק נייטרליים כמו פסיק ונקודה נמצאים בין תווים בעלי כיווניות ימין-לשמאל חזקה הם מקבלים אותה גם הם וממוקמים משמאל לתו האחרון במילה.
מרכז|450px|תווים יורשים כיווניות

מקרה מורכב מעט יותר הוא כזה שבו התו הקודם הוא בעל כיווניות מסוימת, אך עוקבו הוא בעל כיווניות אחרת. במקרה זה, יורש התו הנייטרלי את הכיווניות של התו הבא לפניו ברצף:
מרכז|450px|תווים יורשים כיווניות
ובכיוון ההפוך:
מרכז|450px|תווים יורשים כיווניות

מקרה מורכב עוד יותר מתרחש כאשר ישנו רצף של תווים נייטרליים מסוגים שונים הדורש הכרעה כיצד יש לסדרם. כאן, אלגוריתם דו-הכיווניות כשל לעיתים ורק בגרסתו האחרונה תוקנו בעיות כמו רצפים של תו>מקף>מספר/תו לטיני. קודם לכן, האלגוריתם שיבש את הסדר ודרש מיישומים שביקשו לתמוך בכיווניות נכונה במקרה נפוץ זה (בעברית) ליישם פתרונות "עוקפי-יוניקוד". בגרסת "אופיס 2000" של ערכת התכנות המשרדיות של מיקרוסופט הוגדרה כיווניות כללית לפסקה, ובהתאם לה התנהגו התווים הנייטרליים כאילו הם בעלי כיווניות ימין-לשמאל או שמאל לימין. בגרסה הנוכחית של האלגוריתם פתרונות כאלו אינם נחוצים. לדוגמה, המשפט הבא יוצג נכון באלגוריתם יוניקוד בגרסתו העדכנית:
מרכז|450px|תווים יורשים כיווניות

## בעיות באלגוריתם
באלגוריתם ישנן עדיין מספר בעיות בשימוש בעברית (ובערבית). לדוגמה, רצף מלל כזה:
מרכז|450px|תווים יורשים כיווניות

יוצג בשימוש רגיל באופן שגוי:
מרכז|450px|תווים יורשים כיווניות
מקרה אחר קיים עם הטקסט הבא:
מרכז|450px|תווים יורשים כיווניות
המוצג באופן שגוי כך:
מרכז|450px|תווים יורשים כיווניות

בעיה נוספת נפוצה בכתיבת מספרי טלפון:
alt=תווים יורשים כיווניות|centre|450x450px
הטקסט יוצג כאשר הקידומת מימין למספר הטלפון:
alt=תווים יורשים כיווניות|centre|450x450px|
כדי לפתור בעיות אלו ניתן לעשות שימוש בתווים סמויים מיוחדים המכניסים כיווניות ימין-לשמאל או שמאל-לימין. תוצאה נוספת אפשר לקבל כאשר מכניסים רווחי אפס בעלי כיווניות או תווים השוברים או מאחדים "הקשריות" (בערבית). זה אינו פתרון שמשתמשים רגילים יכולים לעשות בו שימוש בנקל, ועדיין נדרשת השלמה תוכנתית לחסר.

## תווי כיווניות סמויים
תקן יוניקוד מגדיר שני תווי כיווניות סמויים. תווים אלו אינם נראים במסמך ותפקידם לקבוע את כיווניות הטקסט שנמצא לפניהם ואחריהם.
* תו LRM (Left-to-Right Mark) – בעל כיווניות חזקה שמאל-לימין.
* תו RLM (Right-to-Left Mark) – בעל כיווניות חזקה ימין-לשמאל.
תו נייטרלי שיוצב בסמוך לתו LRM, יירש את כיווניותו שהיא שמאל-לימין, ואילו תו נייטרלי שיוצב בסמוך לתו RLM, יירש את כיווניותו שהיא ימין-לשמאל.

אופני השימוש בתווי כיווניות סמויים בפסקה עברית:
* כשרושמים בתוך פסקה עברית את השם הלועזי של חברת Yahoo!, סימן הקריאה יופיע משמאל לשם ("Yahoo!"), מכיוון שאחריו יש אות עברית, אבל הוא אמור להופיע מימין. כדי לגרום לו להופיע מימין, אפשר להוסיף **אחריו** את התו **LRM**. התו מורה, למעשה, שהכיווניות של ימין לשמאל תימשך גם אחרי סימן הקריאה.  בדומה לכך, כשרושמים בתוך פסקה עברית את הפונקציה המתמטית f(x), ייראה הסוגר הסופי כמו סוגר פותח כך: f(x), מכיוון שאחריו יש אות עברית, אבל הוא אמור להופיע בקצה הימני של הביטוי. כדי לגרום לו להופיע נכון בקצה הביטוי, אפשר להוסיף אחריו את התו LRM.
* כאשר בתוך פסקה עברית יש רשימה של מילים לועזיות שמופרדת בפסיקים, למשל Alice, Bob, Carlos, הפסיקים יופיעו מימין לכל מילה, כי לפניהם ואחריהם יש אותיות לועזיות, וגם סדר המילים יהיה הפוך, אבל הפסיקים אמורים להופיע משמאל לכל מילה: Alice, Bob, Carlos. כדי לגרום למילים ולפסיקים להופיע בסדר הרצוי יש להוסיף **לפני** הפסיק את התו **RLM**. התו מורה שהכיווניות של שמאל-לימין תיפסק לפני הפסיק ובמקומה תהיה הכיווניות ימין-לשמאל, כך שהפסיק יופיע משמאל למילים כרגיל בכיווניות של ימין-לשמאל.
* בעת כתיבת מספר טלפון עם קידומת בפסקה עברית כמו בדוגמה "(02) 9876543", שהקידומת מופיעה מימין למספר, וכן בכתיבת מספר שלילי עם סימן מינוס לפניו, שסימן המינוס מופיע מימין למספר, יש להוסיף **לפני** הקידומת או המינוס את התו **LRM**. התו גורם לכיווניות להיות משמאל-לימין באופן מוחלט (כיווניות שמאל-לימין 'חזקה'), החל ממקום הקלדת התו.

תווים אלה עדיין אינם כלולים במקלדת עברית תקנית. בטיוטת התקן הישראלי לפריסת מקלדת עברית ניתן להוסיף תו LRM באמצעות הצירוף , ותו RLM באמצעות הצירוף . תקן זה מיושם בחלקו במערכת ההפעלה Windows, החל מ־Windows 8.

בנוסף, מערכות הפעלה ויישומים שונים מאפשרים הזנת תווי LRM ו-RLM במגוון דרכים:
* במערכת הפעלה Windows מגרסה 8 ובפריסות מקלדת בלינוקס משנת 2013, בפריסת מקלדת עברית תקנית: LRM מוזן באמצעות  (סוגר שמאלי) במקלדת הנומרית ו־RLM מוזן באמצעות  (סוגר ימני).
* ב־HTML תווים אלה מוכנסים כך: , ו-.

## ראו גם
* לוקליזציה
* עזרה:דו-כיווניות - עזרה בנושא דו-כיווניות, באתר ויקיפדיה

## קישורים חיצוניים
* תקן הצגת טקסט דו כיוונית, של ארגון יוניקוד 
* תקן ישראלי SI-5194 - עריכת טקסט דו-כיוונית 
* הצעה לתקן לאבטחת שימושיות של עורכי טקסטים דו-כיווניים
* פרויקט יצירת גרסה חדשה לתקן ישראלי לעריכת טקסט דו-כיוונית, כולל מימוש לדוגמה בקוד פתוח 
* 
* על דו-כיווניות באינטרנט, באתר לינמגזין
* מידע על הכנסת תווי שליטה של יוניקוד תחת לינוקס, באתר Whatsup
* אתר המאפשר המרה של טקסט Right-To-Left ל-Left-To-Right ולהפך
* סדרת מאמרים לגבי הקשיים והמלכודות במימוש BiDi 

## הערות שוליים

קטגוריה:קידוד נתונים
קטגוריה:אלגוריתמים