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

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

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

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

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

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

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

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

בעיה נוספת נפוצה בכתיבת מספרי טלפון:
450x450px
הטקסט יוצג כאשר הקידומת מימין למספר הטלפון:

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

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

אופני השימוש בתווי כיווניות סמויים בפסקה עברית:
* כשרושמים בתוך פסקה עברית את השם הלועזי של חברת Yahoo!, סימן הקריאה יופיע משמאל לשם ("Yahoo!"), מכיוון שאחריו יש אות עברית, אבל הוא אמור להופיע מימין. כדי לגרום לו להופיע מימין, אפשר להוסיף אחריו את התו LRM. התו מורה, למעשה, שהכיווניות של ימין לשמאל תימשך גם אחרי סימן הקריאה. <BR> בדומה לכך, כשרושמים בתוך פסקה עברית את הפונקציה המתמטית 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 תווים אלה מוכנסים כך: , ו-.

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

==קישורים חיצוניים==
* [http://www.unicode.org/reports/tr9/ תקן הצגת טקסט דו כיוונית], של ארגון יוניקוד 
* [https://web.archive.org/web/20150123202535/https://portal.sii.org.il/heb/standardization/teken/?tid=df282b39-7281-4caa-a324-efb781ee2c93 תקן ישראלי SI-5194] - עריכת טקסט דו-כיוונית 
* [https://web.archive.org/web/20130512095510/http://www.usability-standards.com/Projects/BiDi/BidiStdProposal.pdf הצעה לתקן לאבטחת שימושיות של עורכי טקסטים דו-כיווניים]
* [http://bidiedit.lingnu.com פרויקט יצירת גרסה חדשה לתקן ישראלי לעריכת טקסט דו-כיוונית], כולל מימוש לדוגמה בקוד פתוח 
* 
* [https://web.archive.org/web/20060306190810/http://linmagazine.co.il/node/view/3981 על דו-כיווניות באינטרנט], באתר לינמגזין
* [http://www.whatsup.org.il/forum/18255 מידע על הכנסת תווי שליטה של יוניקוד תחת לינוקס], באתר Whatsup
* [http://www.pixiesoft.com/flip/ אתר המאפשר המרה של טקסט Right-To-Left ל-Left-To-Right ולהפך]
* [http://www.lingnu.com/en/programming.html סדרת מאמרים לגבי הקשיים והמלכודות במימוש BiDi] 

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

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