双方向テキストは、右から左(RTL)と左から右(LTR)という2つのテキスト方向を含みます。一般的には、異なる種類のアルファベットを含むテキストを指しますが、行ごとにテキストの方向を変えるブストロフェドンを指す場合もあります。
例えば、ヘブライ語の右から左への表記であるサラ( שרה)は、右側にシン(ש)、中央にレシュ(ר)、左側にヘー(ה)と綴られます。多くのコンピュータプログラムは、テキストを一方向にしか表示できないように設計されているため、これを正しく表示できませんでした。
ペルシア文字やアラビア文字など、いわゆる右から左に書く文字体系の中には、必ずしもそうではないものの、大部分は右から左に書くものもある。数式、日付、単位付きの数字などは左から右に書き込まれる。英語のような左から右に書く言語のテキストが埋め込まれている場合も同様であり、逆にアラビア語が英語のような左から右に書く文字体系に埋め込まれている場合も同様である。
双方向スクリプトサポートとは、コンピュータシステムが双方向のテキストを正しく表示できる 機能のことです。この用語はしばしば「 BiDi」または「bidi」と略されます。
初期のコンピュータシステムは、単一の文字体系のみをサポートするように設計されており、通常はラテン文字に基づく左から右への文字体系のみに対応していました。新しい文字セットと文字エンコーディングを追加することで、他の多くの左から右への文字体系をサポートできるようになりましたが、アラビア語やヘブライ語などの右から左への文字体系は容易にサポートできず、両者を混在させることは実用的ではありませんでした。右から左への文字体系は、 ISO/IEC 8859-6やISO/IEC 8859-8などのエンコーディングによって導入され、文字は(通常)書き順と読み順に格納されます。左から右への表示順序を右から左への表示順序に単純に反転させることは可能ですが、そうすると左から右への文字体系を正しく表示する機能が失われます。双方向の文字体系サポートにより、書き順に関係なく、同じページに異なる文字体系の文字を混在させることができます。
特に、Unicode規格は完全な双方向文字サポートの基盤を提供しており、左から右への文字と右から左への文字が混在する場合のエンコードと表示方法に関する詳細な規則を定めている。
Unicode 規格では、文字は「論理的に」、つまり解釈されることを意図した順序で並べられるべきであり、「視覚的に」、つまり表示される順序で並べるべきではないと規定されています。この区別は双方向通信のサポートにおいて重要です。なぜなら、双方向通信の遷移が発生すると、視覚的な表示が「論理的」な表示ではなくなるからです。そのため、双方向通信をサポートするために、Unicode は文字の論理的な順序を正しい視覚的な表示に変換するアルゴリズムを規定しています。この目的のために、Unicode エンコーディング規格では、すべての文字を「強い」、「弱い」、「中立」、「明示的な書式設定」の 4 つのタイプに分類しています。[ 1 ]
強い文字とは、明確な方向性を持つ文字のことです。この種の文字の例としては、ほとんどのアルファベット文字、音節文字、漢字、ヨーロッパ文字やアラビア文字以外の数字、そしてそれぞれの文字体系に特有の句読点などが挙げられます。
弱い文字とは、方向性が曖昧な文字のことです。この種の文字の例としては、ヨーロッパ数字、東アラビア数字、算術記号、通貨記号などが挙げられます。
中立文字は、文脈がなければ方向が判別できません。例としては、段落区切り文字、タブ、その他のほとんどの空白文字が挙げられます。コロン、コンマ、ピリオド、改行なしスペースなど、多くの文字体系で共通して使用される句読点もこの範疇に含まれます。
明示的な書式設定文字(「方向性書式設定文字」とも呼ばれる)は、アルゴリズムのデフォルトの動作を変更するように指示する特別なUnicodeシーケンスです。これらの文字は、「マーク」、「埋め込み」、「分離文字」、「オーバーライド」に分類されます。これらの効果は、段落区切り文字または「ポップ」文字が現れるまで継続します。
「弱い」文字の後に別の「弱い」文字が続く場合、アルゴリズムは最初に隣接する「強い」文字を調べます。これにより、意図しない表示エラーが発生する場合があります。これらのエラーは、「擬似強い」文字を使用して修正または防止されます。このようなUnicode 制御文字はマークと呼ばれます。マーク ( U+200E左から右へのマーク(LRM)またはU+200F右から左へのマーク(RLM) ) は、囲まれた弱い文字がその書き込み方向を継承するように、特定の場所に挿入されます。
例えば、アラビア語(RTL)の文章で英語のブランド名(LTR)のU+2122 ™商標記号を正しく表示するには、商標記号の後にLTRテキストが続かない場合は、商標記号の後にLRMマークを挿入します(例:「 قرأ Wikipedia™ طوال اليوم.」)。LRMマークを追加しない場合、弱い文字™は強いLTR文字と強いRTL文字に隣接します。そのため、RTLの文脈ではRTLとみなされ、誤った順序で表示されます(例:「قرأ Wikipedia™ طوال اليوم.」)。
方向性のある書式指定文字の「埋め込み」は、Unicode の明示的な書式指定の古典的な方法であり、Unicode 6.3 以降は「分離文字」の使用が推奨されなくなりました。「埋め込み」は、テキストが方向性を持って区別されるべきであることを示します。埋め込み書式指定文字の範囲内のテキストは、周囲のテキストから独立していません。また、埋め込み内の文字は、外部の文字の順序に影響を与える可能性があります。Unicode 6.3 では、方向性のある埋め込みは通常、周囲に強い影響を与え、そのため不必要に使いづらいことが認識されました。
「分離」方向書式文字は、テキストが周囲から方向的に分離されていることを示すものです。Unicode 6.3 以降、これらの書式文字は、対象プラットフォームがサポートしていることが確認され次第、新しいドキュメントでの使用が推奨されています。これらの書式文字は、方向埋め込みが周囲に強い影響を与え、不必要に使いづらいことが明らかになった後に導入されました。従来の「埋め込み」方向書式文字とは異なり、「分離」文字は、スコープ外のテキストの順序には影響を与えません。分離文字はネストでき、埋め込みやオーバーライドの中に配置できます。
「オーバーライド」方向書式文字は、部品番号などの特殊なケース(例えば、英語、数字、ヘブライ文字が混在する部品番号を右から左に強制的に表示する場合など)に対応できますが、可能な限り使用を避けることをお勧めします。他の方向書式文字と同様に、「オーバーライド」はネストすることができ、埋め込みや分離にも使用できます。
U+202D LEFT-TO-RIGHT OVERRIDEを使用すると、テキストの方向が左から右から右から左に切り替わります。同様に、U+202E RIGHT-TO-LEFT OVERRIDEを使用すると、 Unicode 双方向アルゴリズムに基づいて、テキストの方向が右から左から左から右に切り替わります。
U+202C POP DIRECTIONAL FORMATTINGにエンコードされる「pop」方向書式設定文字は、直近の「embedding」、「override」、または「isolate」のスコープを終了します。
このアルゴリズムでは、連結された強文字の各シーケンスを「ラン」と呼びます。同じ向きの2つの強文字の間にある弱文字は、その強文字の向きを継承します。異なる書き方向の2つの強文字の間にある弱文字は、メインコンテキストの書き方向を継承します(LTR文書では文字はLTRになり、RTL文書ではRTLになります)。
トロイの木馬ソースの脆弱性では、Unicodeの双方向文字が使用されています。[ 2 ]
Visual Studio Code は、 2021 年 10 月にリリースされたバージョン 1.62 以降、双方向制御文字をハイライト表示するようになりました。[ 3 ]
Visual Studio は、 2021 年 12 月 14 日にリリースされたバージョン 17.0.3 以降、双方向制御文字を強調表示します。[ 4 ]
中国語の漢字は、特に看板(銘板など)では縦書き(上から下、次に右から左)だけでなく、横書き(上から下、次に右から左)にも書くことができますが、個々の文字の向きは変わりません。これは中国の観光バスでよく見られる光景で、会社名は通常、車両の前方から後方に向かって、つまりバスの右側では右から左へ、左側では左から右へと書かれています。車両右側の英語のテキストも、逆順に書かれていることが非常に一般的です。(下の観光バスと郵便車両の写真をご覧ください。)
同様に、日本語や韓国語など、同じ四角い文字で構成される他のCJK文字体系も、どの方向にも書くことができますが、水平に左から右、上から下、垂直に上から下、右から左の2つの形式が最も一般的なものです。
ブストロフェドンは、古代ギリシャの碑文、古サバイ語(古代南アラビア語)、ハンガリーのルーン文字に見られる書体です。この書体では、行ごとに文字の向きが交互に変わり、通常は個々の文字が反転して書かれます。
ムーンタイプは、視覚障害者のための触覚アルファベットとして考案された、ラテン文字をエンボス加工したものです。当初、行末でテキストの方向が変わりましたが(文字の向きは変わりませんでした)、特別なエンボス加工された線が行末と次の行の始まりをつないでいました。[ 5 ] 1990年頃、左から右への方向に変更されました。