Section 5 : テキストの方向(1)

 文章は,必ずしも左から右へと流れるものとは限らない。現に,日本語の横書きはかつて右から左へと書かれていた。世界の言語の中には,右から左に書くものもある。HTML の国際化への配慮がここにも現れている。

文字の方向

 アラビア語やヘブライ語は,テキストが右から左へと流れていく。HTML では,一般に,テキストの流れる方向DIR 属性で指定する。

DIR 属性
属性 解説
DIR キーワード テキストの流れる方向。

キーワードは以下のいずれかである。

ltr
テキストは左から右へと流れる。
rtl
テキストは右から左へと流れる。

 ここで注意していただきたいのは,現実には言語とテキストの流れる向きとは対応しているものの,HTML において言語コードとテキストの流れる向きは対応していないことである。

 DIR 属性は <BASE><BR><HR><PARAM><SCRIPT> 以外の要素に指定できる。ちなみに,HTML 4 Transitional で用いる <APPLET><BASEFONT><IFRAME>,フレーム定義における <FREAMSET><FRAME> にも指定はできない。

 DIR 属性の値は LANG 属性同様,下位要素へと継承される。

 概念的な例を見ていただこう。この文書には <HTML LANG="en" DIR="ltr"> と書かれていると想定してほしい。

<P>(英文の段落)</P>
<P>(英文の段落)</P>
...
<P LANG="he" DIR="rtl">(ヘブライ語で書かれた段落)</P>
<P>(英文の段落)</P>
...

このとき,DIR="rtl" が指定されたヘブライ語の段落はテキストが右から左へと流れていくだろう。

 DIR 属性は,表組におけるセルの配置にも影響する。DIR="ltr" では列中のセルは左から右へと順に配置されることになるが,DIR="rtl" では逆に右から左へ順にセルが配置されるだろう。

 ちなみに,CSS におけるブロック要素に適用された DIR 属性は text-align 属性の初期値を書き換えうる。一般に,左から右へと書かれる言語は左寄せ,逆に,右から左へと書かれる言語は右寄せである。CSS1 Core により text-align 属性が justify を扱わないときは,DIR 属性に合わせて右寄せ,左寄せを決定することになる。

双方向アルゴリズム

 Unicode では,それぞれの文字が左から右へと書かれるものなのか,右から左へと書かれるものなのかが決められている。たとえば,欧文のアルファベットは“左から右”に書かれる文字,アラビア文字は“右から左へ”書かれる文字である。

 UA には,テキストとは別にこういった文字の流れる向きを判定する双方向アルゴリズムが搭載されるだろう。たとえば,次のような左から右に書かれている HTML の原稿を考える。

<P DIR="ltr">英語1 アラビア語2 英語3 アラビア語4 英語5 アラビア語6</P>

英語の部分はアルファベット,アラビア語の部分は(たとえば欧文の環境では実体参照を使うなどして)アラビア文字で書かれているとしよう。これが双方向アルゴリズムをサポートしている UA で処理されると,出力は次のようになるはずである。

英語1 2語アビラア 英語3 4語アビラア 英語5 6語アビラア

文章全体としては DIR 属性で指定したように左から右へ流れていくのだが,途中のアラビア文字の単語は双方向アルゴリズムによって“右から左への文字”と判定され,文字が右から左へと流れている。

 もし逆に,先ほどの例で DIR="rtl" としたらこうなるだろう。

6語アビラア 英語5 4語アビラア 英語3 2語アビラア 英語1

このように,右から左へと流れるテキストにおいて英語のアルファベットは“左から右への文字”と判定され,英単語は“rtl”の段落にも関わらず左から右へと表示されるだろう。

 要するに,文字レベルでの流れの方向は双方向アルゴリズムで自動的に判定される。ここで気をつけていただきたいのは,(編集環境がテキストを“左から右”に書くものであれば)原稿中ではアラビア語を左から右へと書いておいて,表示のさいに向きを反転させるということである。もし,“気を利かせて”,原稿中でアラビア語を右から左へと書いておくと,表示のときに左から右へと流れてしまうということである。

 その上でさらに,その要素で支配的な言語とそのテキストの流れる向きを LANG-属性,DIR-属性で指定するということになる。

 極端な例をあげておくと,もし英文のみの段落に DIR="rtl" が指定されていたとしても,段落の文字のシーケンスがすべて逆転するわけではなく,双方向アルゴリズムによってテキストとしての表示の向きのみが逆転する,という結果がもたらされる。

<P DIR="rtl">Each language has its own direction of text flow.</P>

.flow text of direction own its has language Each

 一方,ここで生じる問題は,双方向アルゴリズムを搭載していない UA は,前述の英語とアラビア語の例では,アラビア語の文字の流れを反転させることをしない。したがって,左から右へと表示されることになってしまう。かといって,あらかじめアラビア語を右から左へ書いておくと双方向アルゴリズムを搭載した UA はその向きを逆転させてしまう,という問題が発生する。