בעזרת מקש n, ניתן לדלג במהלך הניווט על הדף. דלג לתחילת התוכן
המסמך הינו תרגום. במקרה של טעויות או אי התאמות כלשהן עם המסמך המקורי, המקור האחרון באנגלית יחשב כאמין יותר.
המתרגם: קטרינה שכטמן, אולג גיבורונסקי
Intended audience: content developers working with right-to-left scripts, XHTML/HTML coders (using editors or scripting), script developers (PHP, JSP, etc.), schema developers (DTDs, XML Schema, RelaxNG, etc.), and anyone who is struggling to understand how to make their mixed direction text look right in markup.
Note: Changes have been made to the English original since this document was translated. See the change log.
This tutorial first describes some of the basic principles underlying how the Unicode bidirectional algorithm works. Then it looks at some of the more common scenarios where the bidi algorithm requires help through the addition of markup or control codes.
Although we try to take a markup independent view here, most of the examples will use XHTML, since it is widely recognizable. For advice relative to a specific markup language see the sidebar.
טקסט דו-כיווני הינו מופיע בכתבים מימין לשמאל כגון אלה בערבית, עברית, סיריאק וט'אנה. שלל שפות שונות נכתבות בכתבים אלה.
כל טקסט המשובץ מכתב משמאל לימין וכל המספרים הינם מוצגים וויזואלית שמאל-ל-ימין בתוך תצוגה וויזואלית ימין-ל-שמאל כללית. (כמובן מסמך זה גם כולל טקסט דו-כיווני במקומות בהם מופיעות מילים באנגלית.)
אנו נשתמש ב- RTL (right-to-left) בשביל 'ימין-ל-שמאל' LTR (left-to-right) בשביל 'שמאל-ל-ימין'.
סידור וויזואלי של טקסט היה דרך מקובלת של הצגת עברית ב-HTML על סוכני משתמשים ישנים שלא תמכו באלגוריתם Unicode דו-כיווני. זה עדיין קיים חלקית, מתוך הרגל. התווים המרכיבים את הטקסט נשמרו בקוד המקור באותו סדר שהייתם רואים אותם מוצגים על המסך משמאל לימין.
לדוגמה, ניקח טקסט בעברית עם כיווניות מעורבת:
פעילות הבינאום,
W3C
אם הייתם מסתכלים על התווים האלה בזכרון אחד אחד, הייתם רואים את הדבר הבא גם לטקסט מסודר וויזואלית וגם לטקסט מסודר לוגית. זה גם מהווה סדר של ההקלדה, כך שטקסט בעברית צריך להיות מוקלד הפוך.
| סדר לוגי | סדר וויזואלי | ||
|---|---|---|---|
| 05E4 | פ HEBREW LETTER pE | 0057 | W LATIN CAPITAL LETTER W |
| 05E2 | ע HEBREW LETTER AYIN | 0033 | 3 DIGIT THREE |
| 05D9 | י HEBREW LETTER YOD | 0043 | C LATIN CAPITAL LETTER C |
| 05DC | ל HEBREW LETTER LAMED | 0020 | SPACE |
| 05D5 | ו HEBREW LETTER VAV | 002C | , COMMA |
| 05EA | ת HEBREW LETTER TAV | 05DD | ם HEBREW LETTER FINAL MEM |
| 0020 | SPACE | 05D5 | ו HEBREW LETTER VAV |
| 05D4 | ה HEBREW LETTER HE | 05D0 | א HEBREW LETTER ALEF |
| 05D1 | ב HEBREW LETTER BET | 05E0 | נ HEBREW LETTER NUN |
| 05D9 | י HEBREW LETTER YOD | 05D9 | י HEBREW LETTER YOD |
| 05E0 | נ HEBREW LETTER NUN | 05D1 | ב HEBREW LETTER BET |
| 05D0 | א HEBREW LETTER ALEF | 05D4 | ה HEBREW LETTER HE |
| 05D5 | ו HEBREW LETTER VAV | 0020 | SPACE |
| 05DD | ם HEBREW LETTER FINAL MEM | 05Ea | ת HEBREW LETTER TAV |
| 002C | , COMMA | 05D5 | ו HEBREW LETTER VAV |
| 0020 | SPACE | 05DC | ל HEBREW LETTER LAMED |
| 0057 | W LATIN CAPITAL LETTER W | 05D9 | י HEBREW LETTER YOD |
| 0033 | 3 DIGIT THREE | 05E2 | ע HEBREW LETTER AYIN |
| 0043 | C LATIN CAPITAL LETTER C | 05E4 | פ HEBREW LETTER PE |
סידור וויזואלי כמעט ולא נראה עבור ערבית. מכוון שאותיות ערביות כולן מחוברות היתה מוטיבציה חזקה של חלק ממפתחים לאפשר גישה לוגית.
סידור וויזואלי של הטקסט דורש ממחבר להימנע מעטיפת שורות, טקסטים המייושרים ימינה בתוך טבלאות ואלמנטים ולהוסיף מעברי שורה מפורשים. כמו כן טקסט צריך להיות בקידוד שמונע הפעלתו של אלגוריתם Unicode דו-כיווני בדפדפנים מאוחרים. הנה דוגמה הכתובה ב-HTML:
<table width="50%"><tr><td align="right" nowrap> ,INRIA-מ הפוריאב החראה יתוריש תא הפילחמ W3C<br> W3C-ל רשפאמ יונישה .ERCIM-ל ,תפרצב תמקממ<br> הרימש ךות ,הפוריא יבחרב רקחמה ירשק תא קימעהל<br> ידסייממ דחא ,INRIA םע קזחה ירוטסיהה רשקה לע<br> .2003 ראוניל 1 ב עצבתי יונישה .ERCIM </td></tr></table>
(זה למעשה מימוש נקי. לדוגמה אתם יכולים למצוא דברים כאלה בטקסטים מייושרים ימינה עם <nobr>..</nobr> בכל שורה. אם
חלונכם צר מדי תחילת כל שורה תעלם מאחורי הגבול הימני של הדפדפן.)
התוצאה הינה קוד שביר מאוד שקשה לתחזוקה. לדוגמה, בנוסף לקושי להקליד הפוך לו הייתם רוצים להוסיף כמה מילים בשורה שניה הייתם חייבים להתאים מחדש כל מעברי השורה. כמוכן הייתם צריכים להוסיף ולתחזק סימוני קישוריות והדגשה נפרדים לכל טקסט מסומן שנעטף לשורה אחרת.
סידור לוגי הינו גישה הרבה יותר טובה. בגישה זו טקסט נשמר בזכרון בסדר שבו זה מוקלד (וגם בדר"כ מבוטא). אחר כך אלגוריתם Unicode דו-כיווני מייצר סידור מחדש הנדרש לתצוגה נכונה.
זה עושה יצירת פסקאות ארוכות של טקסט זורם שנעטף באופן אוטומתי לרוחב האלמנט לדבר כמעט טריוויאלי. זה גם הופך את השימוש בקוראי מסך למשימה הרבה יותר פשוטה.
אלגוריתם דו-כיווני פועל על טקסט מסודר לוגית. אם אתם מעדיפים להשתמש בסידור וויזואלי אין טעם בהמשך הקריאה (למעט העובדה שהייתם יכולים להפוך את חייכם להרבה יותר פשוטים).
כאן אנחנו מציגים כמה עקרונות בסיסיים חשובים. גם אם זה נראה משעמם תקראו את זה עד הסוף בגלל שללא הבנת החומר הזה אתם תלכו לאיבוד כאשר תצטרכו לכתוב טקסט דו-כיווני.
אנחנו כבר יודעים שאותיות לטיניות מוצגות אחת אחרי השניה משמאל לימין. מאידך גיסה, האלגוריתם הדו-כיווני יציג סדרת תווים מאופיינים חזק RTL אחד אחרי השני מימן לשמאל.
זה עובד בגלל שלכל תו ב-Unicode יש תכונת הכיווניות. מרבית האותיות הינן מאופיינות חזק כ-Ltr. אותיות מכתבים דו-כיווניים הינן חזק מאופיינות כ-RTL.
כאשר טקסט עם כיווניות שונה מעורבב, אלגוריתם דו-כיווני מציג כל רצף של התווים עם כיווניות זהה כ- ריצה כיוונית נפרדת. כך שבדוגמה הבאה ישנן שלוש ריצות כיווניות שונות:
bahrain דימונה kuwait
התוצאה של האלגוריתם הדו-כיווני תהיה תלויה בהקשר כיווני כולל של הפסקה, בלוק או דף בהם הוא הופעל.
ב-XHTML הקשר זה באופן טבעי יבוטא ע"י הוספת dir="rtl" לתג html (במקרה הזה כל האלמנטים של המסמך ירשו הקשר של
RTL) או השארתו של תג זה ריק (במקרה הזה כיווניות תהיה Ltr). אפשר לשנות את ההקשר יותר מאוחר ע"י שימוש בתכונת dir של הבלוק הרלוונטי.
ריצות כיווניות מסודרות לפי ההקשר הכולל. בדוגמה מעל שהקשרה הכולל הינו Ltr הייתם קוראים 'bahrain' אחר כך 'דימונה' (RTL) ולבסוף 'kuwait'. שימו לב שאינכם חייבים שום סימון או עיצוב מיוחדים כדי שזה יקרה.
אם תשנו את ההקשר הכיווני בדוגמא מעל ע"י שינוי של תכונת הכיווניות בטג html או בבלוק המכיל, תראו את הדבר הבא:
bahrain דימונה kuwait
לרווחים וסימני פיסוק אין ביטוי Ltr ו-RTL ב-Unicode כי הם שימושיים בשני הכתבים. לכן תווים אלה מדורגים כ נייטרליים.
זה המקום איפה הדברים מתחילים להיות מענינים. כאשר האלגוריתם הדו-כיווני פוגש תווים עם כיווניות נייטרלית הוא מחליט על אופן תצוגתם ע"י התבוננות בתווים הסובבים אותם.
תו נייטרלי בין שני תווי RTL חזקים יטופל כאילו היה תו RTL חזק בעצמו וירחיב את הריצה הכיוונית. זו הסיבה למה שתי מילים עבריות בטקסט Ltr נקראות מימין לשמאל. (קודם 'תווים' ואחר כך 'נייטרליים'.)
the title is תווים נייטרליים in Hebrew.
שימו לב שאתם עדיין לא צריכים שום סימון או עיצוב מיוחדים לזה. כאן עדיין ישנן שלוש כיווני ריצה.
החלק שבאמת מעניין מגיע כאשר רווח או סימן פיסוק כלשהם נופלים בין שני תווים עם כיווניות חזקה שונה זו מזו. במקרה הזה תווים נייטרליים יטופלו כאילו הם תווים בעלי כיווניות חזקה זהה לזו של הכולל ההקשר. אפילו אם ישנם כמה תווים כאלה המופיעים יחד, הם עדיין יטופלו באותה צורה.
היישום של כל זה יהפוך ליותר מובן, כאשר נעבור על הדוגמאות בפרק הבא.
האלגוריתם הדו-כיווני יטפל בטקסט בצורה מספקת ברוב המקרים ובדר"כ ללא צורך בשום סימון מיוחד חוץ מהגדרה של הכיוון הכולל של המסמך. אבל אתם כנראה ברי מזל אם זה תמיד יעבוד עבורכם.
בואו נקליד איזשהו סימן פיסוק בסוף החלק העברי של טקסט בדוגמה האחרונה. אנחנו נראה את הדבר הבא:
the title is "תווים נייטרליים!" in Hebrew.
מרכאות אכן במקום, אבל סימן קריאה לא. הוא אמור להופיע בסוף הטקסט העברי, כלומר:
the title is "תווים נייטרליים!" in Hebrew.
בהנתן הבנתנו של האלגוריתם הדו-כיווני אנחנו בקלות יכולים להבין למה זה קרה. בגלל שסימן קריאה הוקלד בין התו ה-RTL האחרון 'ם' (משמאל) ותו Ltr 'i' (במילה 'in'). כיווניותו הוחלטה לפי הכיווניות של הפסקה כולה (כאן Ltr). שימו לב שזה לא משנה שמדובר במקרה הזה בשני סימני פיסוק ורווח - הם כולם נייטרליים ולכן מושפעים באותה צורה. בגלל שסימן קריאה מטופל כ-Ltr הוא מצטרף לריצה כיוונית של 'in Hebrew'.
אז איך למקם את סימני הפיסוק בצורה נכונה? במקרים כמו שלנו אתם בדר"כ תקיפו את הציטטה בעברית עם סימון - או כדי להראות שמדובר בציטטה או פשוט כדי להוסיף אינפורמציה. במקרה הזה זוהי תרופה. השתמשו בתכונת הכיוון כדי לשנות את זרימת הטקסט להיות RTL.
כך זה יכול להיראות ב-XHTML:
the title is "<span dir="rtl" lang="he" xml:lang="he">!תווים נייטרליים </span>" in Hebrew.
שימו לב שתג span נופל בתוךהמרכאות - הן חלק מהטקסט הלועזי שמסביב.
אפשרות אחרת זה להקליד תו RTL חזק בלתי נראה אחרי סימן הקריאה. בדרך זו סימן קריאה יתפרש כ-RTL ויצטרף לריצה כיוונית של עברית.
ב-Unicode קיימים שני תווים מיוחדים למטרה זו - תו U+200F שנקרא RIGHT-TO-LEFT MARK (RLM) ותו U+200E שנקרא LEFT-TO-RIGHT (LRM).
בגלל שתווים אלה אינם נראים יכול להיות שתעדיפו להשתמש בתווים נומריים מתאימים (כגון‏) או
יישות מיוחדת אם קיימת (ב-XHTML למשל ‏). בדוגמה שלנו הוספנו ‏
אחרי סימן קריאה והתוצאה נראת כך:
the title is "!תווים נייטרליים" in Hebrew.
בדוגמה הבאה סדר הרשימה לא נכון כי שתי מילים עבריות אמורות לבוא הפוך ופסיק שהינו חלק מהטקסט הלועזי אמור להופיע מימין בצמוד למילה הראשונה.
the names of these states in Hebrew are עמידה, קריאה and שכיבה respectively.
כאשר מה שהתבקש:
the names of these states in Hebrew are קריאה ,עמידה and שכיבה respectively.
הסיבה לכשלון היא בכך שפסיק המלווה בתווי RTL חזקים משני הצדדים מתפרש ע"י האלגוריתם הדו-כיווני כחלק מהטקסט העברי. למעשה זה חלק מהטקסט הלועזי ואמור לסמן את הגבול בין שתי ריצות כיווניות בעברית.
אם בפרק הקודם התו הנייטרלי חשב שהוא חלק מההקשר הכולל כשלא היה, כאן הוא חושב את עצמו לחלק מהריצה הכיוונית בהיתו שייך להקשר הכולל.
הפתרון האלגנטי הוא להשתמש בתו Unicode בלתי נראה LEFT-TO-RIGHT ישר אחרי הפסיק. זה שם את הפיסוק שלנו בין תווי RTL ו-Ltr ולכן מחייב אותו לקחת את הכיווניות של ההקשר הכולל שהינו Ltr. זה מחלק את המילים העבריות לשתי ריצות כיווניות נפרדות שמסודרות Ltr בהתאם לכיוון העיקרי של הפיסקה.
ייתכן ותעדיפו שוב את NCR (‎) או יישות כגון ‎ אם כזאת זמינה.
לשים סימון מסביב לפסיק במקרה הזה יהיה דומה לשבירת ביצה בעזרת פטיש.
הדוגמאת שהשתמשנו עד כה היו לועזיות ומבוססות Ltr. ניתן לפעול לפי עקרונות דומים עבור הטקסט ה-RTL בשפות כמו עברית או ערבית. נביא דוגמה נוספת:
כך נראה משפט שאנחנו רוצים לראות בפסקה שכיווניותה הינה RTL:
W3C (World Wide Web Consortium) מעביר את שירותי הארחה באירופה ל - ERCIM.
למרבה הצער, ללא התערבות האלגוריתם הדו-כיווני יוצר מזה בלגן רציני:
W3C (World Wide Web Consortium) מעביר את שירותי הארחה באירופה ל - ERCIM.
זה נראה כאילו לסדר את זה יהיה ממש מסובך, אבל הפתרון טריוויאלי. פשוט הכניסו RLM אחרי 'W3C' ואתם סיימתם. זה באמת קל!
אם אינכם משוכנעים, נביא כאן את ההסבר. סימן RLM אחרי 'W3C' מפריד את פיסת הטקסט ה-Ltr הזאת לזרימה כיוונית נפרדת מהטקסט שבסוגריים. זכרו שזרימות יסודרו מימין לשמאל כי זהו הכיווניות של ההקשר הכולל. מאחר ומילה 'W3C' הוקלדה קודם, עכשיו היא מופיעה הכי רחוק מהצד הימני. הסוגריים נמצאים בין תווי RTL ו-Ltr ולכן כיווניות שלהן ככיווניות של ההקשר הכולל - RTL. הן יופיעו הבאות בתור. אחר כך באה זרימה כיוונית Ltr שלמה וזה החלק בתוך הסוגריים.
האלגוריתם Unicode הדו-כיווני וסמנים כיווניים עובדים טוב כאשר יש רק רמה אחת של הטקסט המעורב. אם אתם נתקלים במצב בו יש יותר מרמה מקוננת אחת של הטקסט הכיווני אתם תצטרכו פתרון שונה. הנה דוגמה של טקסט שאינו מסודר נכון:
the title says "פעילות הבינאום, W3C" in Hebrew.
סדר של שתי המילים העבריות נכון, אבל המילה 'W3C' אמורה להופיע משמאל למרכאות ופסיק אמור להופיע בין עברית ל-'W3C'. במילים אחרות, התוצאה הרצויה היא:
the title says "פעילות הבינאום, W3C" in Hebrew.
הבעיה נוצרת בגלל שזרימות כיווניות מסודרות בהתאם לכיווניות ה-Ltr של הפיסקה. לעומת זאת בתוך הציטטה העברית הסדר הנכון אמור להיות RTL. .
כדי לפתור את הבעיה אנחנו נדרשים לפתוח רמת קינון חדשה. ב-XHTML זה נעשה ע"י הוספת הסימון לציטטה כך
שכיווניותה באופן מפורש הופך ל-RTL בעזרת תכונת dir .
the title says "<span dir="rtl">פעילות הבינאום,
W3C</span>" in Hebrew.
בשפות סימון שונות מ-XHTML/HTML אתם יכולים למצוא תכונה דומה לה אפשר לתת ערך שיגרום לתוצאה הרצויה. אם אין לכם תכונה כזאת אתם תצטרכו לסדר מחדש את הסימון המתאים לעיצוב אישי, אבל עדיף אם תשדלו את יוצר שפת הסימון שלכם לתמוך בתכונה כזאת.
ישנם תווי Unicode מיוחדים שאתם יכולים להשתמש כדי להשיג את אותה תוצאה, אבל בגלל שהם יוצרים מצבים עם גבולות בלתי נראים זה לא מומלץ.
מספרים בכתבי RTL רצים משמאל לימין בתוך זרימה ימין-ל-שמאל, אבל הםן מטופלים קצת שונה מאשר מילים ע"י האלגוריתם הדו-כיווני. הם נקראים בעלי כיווניות חלשה. שתי דוגמאות הבאות מראות את ההבדל. השוואה בין שני המקרים מראה שמילים משני צדי הפריט הרביעי בסדרה באות בסדר הפוך. ההבדל היחיד בין שני המשפטים בזכרון הינו השימוש ב-'1234' במקום 'four'.
one two שלוש four חמש
one two שלוש 1234 חמש
בדוגמה הראשונה אותיות במילה 'four' הינן בעלות כיווניות חזקה ולכן מחלקות את שתי המילים העבריות לריצות כיווניות שונות מסודרות משמאל לימין לפי ההקשר הפיסקה.
בדוגמה השניה מספר '1234' שהינו בעל כיווניות חלשה מתפרש כחלק מהטקסט העברי שמצטרף לאותה ריצה כיוונית, למרות שסדרת מספרים הינה Ltr על המסך.
זה קורה רק בטקסט RTL.
נשמע מסובך? אל חשש, בדר"כ האלגוריתם הדו-כיווני יעשה עבודה עבורכם. אנחנו כללנו את הסעיף הזה בשביל אלה ששמו לב להבדל ותהו למה.
שימו לב שלצד המספרים עוד כמה תווים נייטרליים אחרים כגון נקודה עשרונית וסמלי מטבעות חוץ יטופלו כחלק מהמספר ולא כתו נייטרלי.
ייתכנו מקרים בהם לא תרצו שהאלגוריתם הדו-כיווני יעשה דבר. במקרים האלה אתם תצטרכו סימון נוסף "לעטוף" את הטקסט אותו אתם רוצים להשאיר לא נגוע.
ב-XHTML גירסה 1.0 זה הושג ע"י שימוש באלמנט bdo. ב-XHTML גירסה 2 זה קרוב לוודאי ימומש ע" rlo או lro
שבתכונת הכיווןהכיוון ויהיה ניתן להפעילם על כל אלמנט. ישנם תווי Unicode מיוחדים שתוכלו להשתמש כדי להגיע לאותה תוצאה, אבל הם יוצרים גבולות בלתי נראים
וזה לא מומלץ.
דוגמאות שמראות את התווים כפי שהם מסודרים בזכרון משתמשים בתג bdo כדי להגיע לתוצאה זו. למשל, כדי להראות את הסדרת התווים
שמונחת ביסוד המשפט הבא:
פעילות הבינאום, W3C
ב- XHTML 1.0 אנחנו נשתמש בסימון הבא:
<p><bdo dir="ltr">פעילות הבינאום,
W3C</bdo></p>
התוצאה המופיעה משמאל לימין תהיה:
פעילות הבינאום, W3C
אמור לנו מה דעתך (באנגלית).
התוכן פורסם לראשונה ב-29 לספטמבר 2004. עדכון מהותי ראשון 2007-03-20 17:20 GMT
להיסטוריה של שינויים במסמך, חפש את article-inline-bidi-markup בבלוג של i18n.
Copyright © 2003-2006 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark, document use and software licensing rules apply. Your interactions with this site are in accordance with our public and Member privacy statements.