双方向テキスト(Bi-directional Text)とは
双方向テキスト(BiDi)とは、左から右に書く(LTR)テキストと、右から左に書く(RTL)テキストが混在するテキストのことです。主に、
ヘブライ文字や
アラビア文字のような右横書きの文字体系と、数字や
ラテン文字のような左横書きの文字体系が同一の文章内で使用される場合に必要となります。コンピューター上で双方向テキストを正しく処理するための
アルゴリズムを双方向
アルゴリズムと呼びます。
双方向テキストの概要
現代では、
ヘブライ文字、
アラビア文字、
シリア文字、
ターナ文字などが右横書きの文字体系として用いられています。これらの文字体系では、数字は常に左から右に書かれるため、単一の言語内でも双方向テキスト処理が必要になります。特に多言語が混在する環境では、双方向テキストの適切な処理が非常に重要です。
表示順と論理順
双方向テキストには、表示順と論理順という2つの概念があります。
- - 表示順: 表示方向を固定し(通常は左から右)、右から左に書くテキストは逆順に格納する方法です。表示アルゴリズムは単純化できますが、右横書きのテキスト入力には特殊な処理が必要になります。
- - 論理順: テキストを論理的な順序で格納する方法です。左横書きでも右横書きでも、テキストの論理的な順序に従って格納されます。表示アルゴリズムは複雑になりますが、より自然なテキスト処理が可能です。
MIMEの双方向テキストに関する規格であるRFC-1556では、
アラビア文字や
ヘブライ文字の表示順を規定しています。W3Cでは論理順の使用を推奨しており、
Unicodeも論理順を採用しています。
初期状態と文字の方向
Unicodeでは、段落の最初の「強い」文字(後述)によって、その段落の方向(左横書きまたは右横書き)が決定されます。しかし、この方法では不便な場合が多いため、多くのテキストエディタではユーザーが明示的に方向を指定できるようになっています。
文字には、既定の方向があります。
ラテン文字、
漢字、かななどは左横書きの文字、
アラビア文字や
ヘブライ文字などは右横書きの文字です。これらの文字が混在した場合、左横書きの段落では、右横書きの文字は逆順に表示されます。
例えば、左横書きの段落で「いろは ABC にほへ DEF とちり」と書いた場合、「いろは CBA にほへ FED とちり」と表示されます。
ただし、数字列の場合は特別な処理が必要です。例えば「いろは ABC 123 DEF にほへ」は、「いろは FED 123 CBA にほへ」と表示されます。「123」は左から右へ表示されますが、その位置は先行する文字列の左に置かれます。
Unicodeでは、
アラビア文字と
ヘブライ文字での弱い文字の処理が異なります。例えば、「120%」は
アラビア文字では「%120」と表示されますが、
ヘブライ文字では「120%」のままです。
方向によって字形の変わる文字
括弧類や不等号などは、左から右へ書く場合と右から左へ書く場合で字形が左右反転します。
双方向テキストに関する規格
JIS X 0211:
制御機能に関する規格で、横書き(左から右、右から左)と縦書き(上から下、下から上)に対応した制御機能が定義されています。表示方向はSPD(表示方向選択)、書字方向はSCP(文字進路選択)、SDS(方向付き文字列開始)、SRS(逆文字列開始)、SIMD(自動移動方向選択)などによって指定します。
Unicode:
Unicodeでは、各文字に暗黙の方向属性(Bidirectional Class)が付与されています。また、以下の記号によって文字の方向を明示的に変更できます。
- - LRM (Left-to-Right Mark): 表示されない左横書きの文字として機能。
- - RLM (Right-to-Left Mark): 表示されない右横書きの文字として機能。
- - ALM (Arabic Letter Mark): アラビア文字用の右横書き文字として機能。
- - LRO (Left-to-Right Override): 後続の文字列を強制的に左から右へ表示。
- - RLO (Right-to-Left Override): 後続の文字列を強制的に右から左へ表示。
- - LRE (Left-to-Right Embedding): 後続の文字列を左から右の方向性に置く。
- - RLE (Right-to-Left Embedding): 後続の文字列を右から左の方向性に置く。
- - PDF (Pop Directional Formatting): LRE、RLE、LRO、RLOで開始した状態を終了。
- - LRI (Left-to-Right Isolate), RLI (Right-to-Left Isolate), PDI (Pop Directional Isolate): 指定した文字列を中立な文字列として扱い、周囲の文字列に影響を与えない。
- - FSI (First Strong Isolate): 後続の最初の強い文字によって、方向が決定される。
LRM、RLM、ALMが最もよく使用され、LROとRLOの使用はセキュリティ上の問題から非推奨となっています。
HTML:
HTML 4.01では、暗黙の文字の進行方向は左横書きに固定されており、`dir`属性によって方向を変更できます。また、`BDO`要素によって表示順を変更できます。
HTML5では、`BDI`要素が追加され、要素内のテキストが周囲に影響を与えないように分離できます。
CSS:
CSS 2では、`direction`(`rtl`または`ltr`を指定)と`unicode-bidi`(`normal`、`embed`、`bidi-override`を指定)の2つの属性が定義されています。CSS 3では、`unicode-bidi`に`isolate`、`isolate-override`、`plaintext`が追加されています。
セキュリティ上の脆弱性
双方向テキストの処理は複雑であり、実装の不備を突いた攻撃が存在します。また、
制御文字を使って拡張子を偽装し、
マルウェアを画像やテキストファイルに見せかける手口も存在します。人間のレビューアの目を逃れて危険なコードを挿入する手法も指摘されており、注意が必要です。
まとめ
双方向テキストは、異なる書字方向の文字が混在するテキストを正しく処理するために重要な技術です。
Unicodeなどの規格に従い、適切な
アルゴリズムと制御記号を使用することで、多言語環境における正確なテキスト表示が可能になります。しかし、実装の不備によるセキュリティ上の脆弱性にも注意が必要です。