双方向テキスト (BiDi)

左→右 (LTR) と右→左 (RTL) のテキストが混在する処理。アラビア語やヘブライ語を含む多言語テキストで必要。

双方向テキスト (BiDi: Bidirectional Text) は、左から右 (LTR: Left-to-Right) に書く言語と右から左 (RTL: Right-to-Left) に書く言語が同一テキスト内に混在する状況を扱う技術です。アラビア語やヘブライ語は RTL で書かれ、世界の約 12 の言語が RTL を採用しています。グローバルなサービスを提供する Web サイトでは、BiDi 対応は避けて通れない課題です。

Unicode Bidirectional Algorithm (UBA) は、テキスト内の各文字の方向性を自動判定し、正しい表示順序を決定します。各 Unicode 文字には「強い方向性」(アラビア文字は RTL、ラテン文字は LTR) または「弱い方向性」(数字や句読点) が割り当てられています。弱い方向性の文字は周囲の文脈に応じて方向が変わるため、「RTL テキスト中の電話番号 03-1234-5678 が逆順に表示される」といった問題が起こりえます。Unicode 双方向テキストの書籍で UBA の仕組みを学べます。

HTML では dir="rtl" 属性や <bdo> (Bidirectional Override) 要素で方向を明示的に制御します。CSS の direction プロパティや論理プロパティ (margin-inline-startpadding-inline-end など) も BiDi 対応に重要です。物理プロパティ (margin-left) の代わりに論理プロパティを使うことで、LTR/RTL の切り替えに自動対応できます。

BiDi テキストはセキュリティ上の懸念もあります。2021 年に報告された Trojan Source 攻撃では、Unicode の方向制御文字 (RLO、LRI など) を悪用してソースコードの見た目と実際の実行順序を異なるものにする手法が示されました。多くのコードエディタやリポジトリホスティングサービスがこの問題への対策を実装しています。Web アクセシビリティと国際化の書籍で BiDi 対応のベストプラクティスを習得できます。

文字数カウントにおいて、BiDi テキストは見た目の文字数と内部的な文字数が一致しない場合があります。方向制御文字 (U+200F、U+200E など) はゼロ幅で画面に表示されませんが、文字数としてはカウントされます。正確な文字数を把握するには、これらの不可視文字の存在を意識する必要があります。