* bdo 要素型 (HTML, XHTML 1)

[1] [CODE(HTMLe)[bdo]] 要素型は、 [[bidi]] 算法を局所的に上書き (override)
したいときに使うことができます。 (<IW:HTML4:"struct/dirlang.html#edef-BDO"> 参照。)

HTML の bidi 算法については、 [CODE(WikiPage)[[[書字方向]]]],
[CODE(HTMLa)[[[dir]]]] 属性の解説も参照してください。

[12] 仕様書:
- [[SI 4281]]:1998
-- [CSECTION[6.1.2 The Bidirectional Override Tag (BDO)]]
<http://www.qsm.co.il/Hebrew/si4281e.htm>

[2] 
:[[開始タグ]]:必須。
:[[終了タグ]]:必須。
:[[内容模型]]:[CODE(SGML)[([VAR[%[[inline]];]])*]]
:[[属性]]:
,名前	,値の型	,既定値	,意味	,出典
,[CODE(HTMLa)[[[class]]]]	,	,	,級	,[HTML4] [VAR[%[[coreattrs]];]]
,[CODE(HTMLa)[[[dir]]]]	,	,(必須)	,[[書字方向]]	,[HTML4]
,[CODE(HTMLa)[[[id]]]]	,	,	,一意識別子	,[HTML4] [VAR[%coreattrs;]]
,[CODE(HTMLa)[[[lang]]]]	,	,	,自然言語	,[HTML4]
,[CODE(HTMLa)[[[style]]]]	,	,	,スタイル指定	,[HTML4] [VAR[%coreattrs;]]
,[CODE(HTMLa)[[[title]]]]	,	,	,説明的題	,[HTML4] [VAR[%coreattrs;]]


[3] 必須の [CODE(HTMLa)[dir]] 属性の値が、その要素の文[[内容]]の[[基底方向]]となります。

[4] 普通は書字方向の制御は使用されている[[文字]]自体の特性により、
それが不十分であっても任意の属性についての [CODE(HTMLa)[dir]]
属性の指定により、意図した通りにすることができます。
しかし、それでもうまくいかない場合が存在します。
そのときに使うことができるのが、この [CODE(HTMLe)[bdo]] 要素型です。

[CODE(HTMLe)[bdo]] 要素型は、順序についての絶対的な制御が必要な場面でしようするべきです (should)。

[5] HTML 4 仕様書の説明によれば、この要素型が想定しているのは、
[[表示順]]で符号化したいときのようです。
たとえば、

> トラックの側面に「輸運らたんな」と書いてありました。

を HTML でマーク付けするときに、

> トラックの側面に<q dir="rtl">なんたら運輸</q>と書いてありました。

とする代わりに、

> トラックの側面に<q><bdo dir="ltr">輸運らたんな</bdo></q>と書いてありました。

ともできる、ということです。

[6] [[ヘブライ文字]]や[[アラビア文字]]を[[符号化]]するにあたって、
昔から表示順 (visual order, [[視覚順]]) と意味順 ([[論理順]]) が両方使われてきました。
特に欧米のソフトウェアを地域化したようなソフトウェアでは、
表示順で符号化した方が処理は圧倒的に楽です。

HTML 4 仕様書によれば、ヘブライ文字圏では [CODE(HTMLe)[[[table]]]]
を使って、表示順で符号化した上で右寄せ、行折り畳み (wrap)
なし、というのがよく行われていたそうです。
そのような慣習の文書は HTML 4 には適合しませんが、
古い実装と互換でありつつ HTML 4 的にするためには、
適当に [CODE(HTMLe)[bdo]] のタグで囲んでしまえばよいのです。

[7] なお、同じ目的のために、 [CODE(char)[[ABBR[[[LRO]]] [LEFT-TO-RIGHT OVERRIDE]]]]
([CODE(char)[U+202D]]), [CODE(char)[[ABBR[[[RLO]]] [RIGHT-TO-LEFT OVERRIDE]]]]
([CODE(char)[U+202E]]), [CODE(char)[[ABBR[[[PDF]]] [POP DIRECTIONAL FORMATTING]]]]
([CODE(char)[U+202C]]) を使うことができます。
(混用についての [CODE(HTMLa)[dir]] 属性の解説も参照されたし。)

[8] このような背景ですから、おそらく、新しく書かれる文書ではこの要素型は使用するべきではないと思います。

[9]
[PRE[
要 よ 文 に >>5-6
素 く 字 す こ
型 あ ほ る ん
を る ど の な
用 の で も 風
意 だ は ヘ に
し し な ブ 縦
て 専 い ラ 書
お 用 に イ き
く の し
れ    ろ
]PRE]

[SEE[ [[縦書きエミュレーション]] ]]

[10] >>9 計算機の能力が低かった (あるいは今でも低い) がために不適切な文字の並べ方をしてきた例は[[右横書き]]や[[縦書き]]だけではなくて、例えば[[半角]]と[[全角]]の幅を想定した整形とか、1文字ごとに[[空白]]を挿入 ([[中文]]の文章でよくある) とか、一行ごとに空行を挿入とか、 [[ASCII]] や [[ISO-8859-1]] と見せかけて実は [CODE(HTMLe)[[[font]]]] 要素を使って別の文字を表現 ([[東南アジア]]の言語の文章に多い。欧米や日本でも、 [[Symbol]] フォントとかでよくある。
[SEE[ [[フォント依存符号化]] ]]) とか、色々あるわけだ。そういう過去 (または現在) の悪しき慣習のうちで右横書きだけが [CODE(HTMLe)[bdo]] だけが特別扱いされる (ように見える) のは、仕方が無い側面もあるとはいえ、どうかなあとは思う。

[11]
要素型名は [Q[[ABBR[''b''i''d''i]] ''o''verride]]
(双方向性上書き) に由来しています。

* 文脈

[20] 
[[日本語文字]]は現代において[[左横書き]]されることがが大多数で、
[[Unicode文字]]としてもそのように扱われています。
標準の状態では[[右横書き]]できません。
そこで [CODE[bdo]] [[要素]]を使って [CODE[dir][dir=""]] [[属性]]を
[CODE[rtl]] にするこで、[[右横書き]]に「上書き」できます。

* 関連

[17] [CODE[bdi]] は別です。

* 歴史

** [CODE[bdo]] 要素の誕生

[FIG(data)[ [22] [[HTML要素概説]]

:[F[要素名]]:[CODE[bidi]]
:日付:[TIME[1995-08-15]]
:説明:
[TIME[1995-08-15]]の
[[HTML 2.x]] に
[CODE[bidi]]
がある。
現在の [CODE[dir]] 属性と [CODE[bdo]] に当たる。
:出典:
[REFS[

-
[CITE@en[Internationalization of the Hypertext Markup Language]], 
[DATA(.author)[[[Franois Yergeau]]]],
[DATA(.author)[[[Gavin Thomas Nicol]]]],
[DATA(.author)[[[Glenn Adams]]]],
[DATA(,author)[[[Martin J. Duerst]]]],
[DATA(.status)[[[Internet Draft]]]],
[TIME(.published)[1995-08-15]],
[TIME[2024-08-16T03:32:31.000Z]] <https://datatracker.ietf.org/doc/html/draft-ietf-html-i18n-00>


]REFS]

]FIG]

[FIG(data)[ [24] [[HTML要素概説]]

:[F[要素名]]:[CODE[bdo]]
:日付:[TIME[1995-09-25]]
:説明:
[TIME[1995-09-25]]、
[[HTML 2.1]] から
[CODE[bidi]]
が削除され、
[CODE[bdo]]
が追加された。
:出典:
[REFS[

-
[CITE@en[Internationalization of the Hypertext Markup Language]], 
[DATA(.author)[[[Franois Yergeau]]]],
[DATA(.author)[[[Gavin Thomas Nicol]]]],
[DATA(.author)[[[Glenn Adams]]]],
[DATA(,author)[[[Martin J. Duerst]]]],
[DATA(.status)[[[Internet Draft]]]],
[TIME(.published)[1995-09-25]],
[TIME[2024-08-16T04:10:13.000Z]] <https://datatracker.ietf.org/doc/html/draft-ietf-html-i18n-01>

]REFS]
:参照:[CODE[bdi]]

]FIG]

** 不思議解釈

[13]
[CITE[連絡先 : Alpha]] ([[exeal]] 著, [TIME[2006-10-14 18:44:55 +09:00]] 版)
<http://alpha.sourceforge.jp/contact.html>

この[[文書]]では、 [[spam]] 対策だと思いますが、
実際の[[メイル・アドレス]]を全[[文字]]逆順に並べ、
[CODE(HTMLe)@en[[[bdo]]]] で括っています。

つまり、データとしては実際とは逆順にしながら、
[[レンダリング]]は実際と同じ順序にしています。

このような使い方は [CODE(HTMLe)@en[[[bdo]]]]
の趣旨に反すると考えられ、不適切です。

[21] 
けど [[HTML4]] の解説は[[視覚順]]の表記に対応するため、なのでこういう使い方もありなんですよね。
この場合 [[HTML4]] の規定が (歴史的事情とはいえ) 酷すぎるんですが...

** HTML もどき

[53] 
[[DTBook]] にもあります。

[18] 
[[DTBook]] では [CODE[lang=""]] は[[大域属性]]ではなく、
[CODE[bdo]] [[要素]]に特に [CODE[lang]] [[属性]]が定義されています。

;; [19] 他の[[言語]]からの[[引用]]で[[書字方向]]もかわるようなケースが想定されているのでしょうか。

- [54] [CITE@en-US[DAISY ANSI/NISO Z39.86-2002 - The DAISY Consortium]], [TIME[2023-11-26T04:45:46.000Z]] <https://daisy.org/info-help/document-archive/archived-projects/daisy-ansi-niso-z39-86-2002-archived/>




** XHTML2

[14] [[XHTML2]] の最初の[[作業原案]]には [CODE(HTMLe)@en[[[bdo]]]] [[要素]]が含まれていましたが、
2つ目の[[作業原案]]では削除され、代わりに [CODE(HTMLa)@en[[[dir]]]]
[[大域属性]]に値が追加されています。

** HTML5

[15] [CITE@en[Web Applications 1.0 r8317     Move all requirements about bidi out and just rely on CSS instead. Also, fix the CSS rules for <bdo>.]]
( ([TIME[2013-12-03 05:07:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8316&to=8317>

[16] [CITE@en[W3C mobileOK Basic Tests 1.0]]
([TIME[2017-10-02 19:35:40 +09:00]])
<https://www.w3.org/TR/mobileOK-basic10-tests/#STYLE_SHEETS_USE>