(2012-12-04)ブログのコメント欄で起きる身近な例を出発点に、双方向性が絡む問題と解決法を探る。&rlm;)は、書式方向「右から左」のゼロ幅文字だ(幅がゼロなので、書いてあっても目には見えない)。これは書式方向制御文字(ここから「右から左」にしろ、というたぐい)ではない。いうときに使うのだろうか。「こんにちは!」という意味のヘブライ語「シャローム!」の最後につける感嘆符(びっくりマーク)について考える。21大域的な書式方向が左から右になっているなかにこのコードを書くと、期待通りの効果が得られないだろう。ヘブライ文字の部分はちゃんと右から左につながるが、感嘆符がヘブライ語の行頭(いちばん右)に来てしまう。パーサが間違っているというより、上のコードがそれだけでは、あいまいだからだ。どこがあいまいか?この現象は、双方向アルゴリズムが作用する境界があいまいなために発生する。これはヘブライ語の文字で右から左に結合すべきことが定められているので、ここから「右から左」ブロックになる。まで4文字を読み込んだあと(ここまではヘブライ文字)、感嘆符を発見する。感嘆符のあとでは、ふたたび左から右へ進む文字が並んでいる。感嘆符そのものがどちらのブロックに属するかが、ハッキリしない。特殊扱いすべきブロックに属する証拠がないので、パーサは、感嘆符をデフォルト扱いするだろう。「右から左」ブロックに含めないようにするだろう。感嘆符がどっちのブロックに属するのか、形式的に判断する方法はない。それとも「シャローム!」の感嘆符まで含めて引用しているのかハッキリしない。感嘆符でなく、ピリオドや疑問符のようなほかの句読点でも、同じことが起きる。dir属性のような上位の制御が利用できるとは限らないから、HTMLのdir属性はユニコードのレイヤにおける本質的な解決法ではない。パーサは迷わず感嘆符を「右から左」ブロックに含める。観察しやすくするため、2つめの感嘆符を疑問符に変えて調べてみよう。見かけ上、ヘブライ語部分の行頭(いちばん右)に現れるだろう。シャローム」でヘブライ語ブロックが終了して、「?」はヘブライ語ブロックに続く次のブロックに属すると認識されたためだ。句読点がブロックの境目にならないよう、句読点のあとでも、まだまだ右から左へ進む文字が続いているようにすれば良い。実際にヘブライ語文がまだまだ続いていれば、何もしなくても良い。感嘆符のうしろに「見えないヘブライ文字」があるようにすれば良い。ヘブライ語に限らず、アラビア語での同様な問題を解決するのに使うことができる。幅なし(zero-width)なので、このコードポイントは論理的に(バイナリーで)のみ存在し、表示上は見えない。置くことも考えられる。して参照することもできる。-->次の2つの例を比較せよ。&#x05e9;&#x05dc;&#x05d5;&#x05dd;!שלום!&#x05e9;&#x05dc;&#x05d5;&#x05dd;!&rlm;שלום!‏ユニコードで、日本語や英語の文字は「左から右に書く」という文字単位の強い属性を持っている。ヘブライ語やアラビア語の文字は「右から左に書く」という文字単位の強い属性を持っている。具体的には、同一の強い書式方向属性をもつ文字に囲まれると、その属性を継承して、弱い書式方向属性をおびる。強い書式方向属性がある文字に逆に影響を与えることはできない。その句読点は、より上位レベルを調べるまでもなく、ローカルな前後の環境から「右左」属性を継承する。べんりな機能ではあるが、しょせんメモ帳なので、あまり使いやすくはない。プレフォーマットされていることが多い。(ヘブライ文字そのものをひっくり返しに書くわけでなく、パラグラフの最後の句読点のみ細工する。比較的に古いブラウザでも期待通りの表示が得られるだろう。数字」のパターンに潜む問題と、解決法を探る。この問題は、目で見た場合の表示に関係するものだ。テキストを読み上げた場合には、関係ない。問題の性質を言葉で説明すると、こうなる。A、B、X、Y、1、2、という6文字が並んでいるとする。普通の文字は、左から右に並ぶ。XとYは、右から左に並ぶ文字だとする。アラビア語の文字は、そういう仕組みになっている。右から左に進むのだから、それを左から右に読むと、Y、X、の順番に文字があるように感じられる。データは、X、Y、という順序だが、逆向きに並んでいるように感じられるのだ。すると、A、B、X、Y、1、2、という6文字は、A、B、Y、X、1、2、の順序で出力されるのだろうか。普通は、そう思うだろう。実際には、1、2、という数字の部分まで、順序が変わってしまう。A、B、X、Y、1、2、という6文字が、A、B、1、2、Y、X、の順序で出力されるのだ。X、Y、1、2、を単純にひっくり返せば、2、1、Y、X、になる。実際には数字の部分が特別扱いされて、1、2、Y、X、という順番になる。結局、A、B、X、Y、1、2、という6文字のデータが視覚的に出力されると、A、B、1、2、Y、X、の順序になる。X、Yは、特殊な文字だから、逆向きに出力されるのが正しいけれど、その後ろにある数字の位置も、影響されてしまう。コンピュータは、X、Y、の後ろにある数字を、右から左に進む文字の続きだと解釈するからである。右から左に進む文字の中にあっても、数字は特別に、左から右に進む。このように、方向が違う文字が交ざると、複雑で分かりにくい問題が起きる。以下では、この問題を研究する。属性は「テキスト方向」を表すが、挙動が複雑で、役立たない場合もある。使うと、問題は簡単に解決する。将来的には、「ユーザー入力欄などの動的に生成される語句は、このタグで隔離」というのが常識になるかもしれない。1918–1970)は...数字の位置がおかしい上、生年と没年もあべこべだ。「左から右に書く文字」・「右から左に書く文字」が混在するテキストの処理を双方向アルゴリズムと呼ぶが、次のように動作する:アラビア文字・ヘブライ文字などの←「右から左」の文字に半角や全角の数字が後続する場合、その数字は←「右から左」の範囲の一部となり、従って文字の←左に表示される。数字そのものは、その位置で「左から右」→に並ぶ。文字と後続の数字の間に、スペースや句読点が含まれていても結果は変わらない。123このように、「右から左」の文字と後続する数字の位置関係には、2種類の可能性がある(「右から左」の表示それ自体は、現在のソフトウェアなら自動で正しく行われる)。双方向アルゴリズムでは、デフォルトで前者のパターンになる。「数字を含む現代ヘブライ語の文章」(前者のパターン)はいくらでも存在するが、「ヘブライ文字と数字を含むヘブライ語でない文章」は比較的まれなので、このデフォルト設定は妥当だろう。例1・例2の「乱れた」表示も、実は乱れているわけでなく、仕様通りの正しい結果だ。上の例は、ヘブライ文字に続く数字「2012」が仕様通りに配置されたもの。アラビア文字の部分、カンマ、スペース、「1918」、ダッシュ、「1970」。これらは正しいデフォルト表示だが、意図する表示とは違う。タグや制御文字を使って表示方法を指定する必要がある。属性を使って、この種の問題を解決できることがある。使い方にはこつがあり、やたらと付ければいいものではない。筋の通った模範解答のようにも思える。は...例2において、アラビア文字のテキスト方向はすでに正しい。デフォルト表示で都合悪いのはアラビア文字の並び方ではなく、その後ろの数字の位置だ。属性を指定すると問題が解決する。MARKを挿入する方法もある。いう簡単な表記で使える。「右から左」の文字と数字の間にこれを挿入すれば、「右から左」区間が数字の手前で終了するようにできる。属性を使う方法より簡潔で、意図も明確だ。Isolate(双方向性における隔離区域)という意味で、「この部分の方向性は独立しています。後ろの数字とつながったりはしません。切り離して考えてください」と指示する役割を持つ。数字(例えば値段)が乱れて表示されると、情報が正しく伝わらず、場合によってはセキュリティー問題にもつながる。「ユーザーが自由に入力できる欄によって、その欄と関係ない隣の欄の表示が影響される」という状況は、良くない。付ける」というのが常識になるかもしれない。しておけば、世界中のどういう文字がそこに来ても周囲の表示は乱れないからだ。まとめ「右から左」の文字の直後にある数字は、デフォルトで左側に表示される。文字と数字の間にカンマ、ハイフンなどがある場合も同様。使える簡単で確実な方法。