CSS与标记语言对双向文本的支持

问题

在HTML和基于XML的标记语言中,我应该用CSS还是标记语言来正确显示基于Unicode的双向(bidi)文本?

简答

在有标记可用的情况下,你应该始终使用专用的双向文本标记来描述你的内容。

对于HTML,双向文本标记就足够了,不需要CSS的bidi样式。绝对不要将CSS的bidi样式用于普通的HTML元素或属性。这包括以XML形式提供的内容(比如XHTML 1.x或polyglot标记)。

对于其他以XML形式提供的内容,如果有专用的双向文本标记,你也应该使用它,但你可能需要用CSS样式来指定标记的预期行为。

详细信息

使用专用标记

因为文本方向是文档结构的一个组成部分,所以应该使用标记来为文档或信息块设置文本方向,或者标记文本中仅靠Unicode双向文本算法无法实现预期的文本方向的位置。

为了产生预期的从右到左或双向效果,一些人简单地把CSS应用于围绕相关文本的所有通用段落或内联元素。但是,由CSS应用的样式并不是永久的。它可能被关闭、被覆盖、无法识别,或者在不同的上下文中被更改/替换。标记语言的代码也可能出现在用不了CSS的地方,例如数据库或代码片段。

虽然双向文本标记只是用于文本的视觉渲染,但它在功能上并非纯粹的装饰性。

标记以持久的方式与文档内容保持集成。如果你使用专用的双向文本标记,它还让内容更加清晰。因此,在有专门的双向文本标记时,你应该使用它。不要简单地将CSS样式添加到通用元素来实现效果。

请注意,这假设以标记语言编写的文件总是可以用用于支持混合方向文本的标记。我们鼓励设计或维护DTD或Schema的人为此目的添加元素或属性。

text/html形式提供的HTML或XHTML

仅使用标记语言CSS书写模式规范建议在HTML中对双向文本使用标记。

"如果文档语言提供了控制双向文本的标记特性,作者和用户应该使用这些特性,而不是指定CSS规则来覆盖它们。"

实际上,它明确声明作者不应该在HTML中使用directionunicode-bidi属性。这是因为HTML规范清楚地定义了浏览器对于双向文本标记的预期行为。

application/xhtml+xml形式提供的XHTML 1.x或polyglot标记

application/xhtml+xml形式提供的XHTML 1.x和polyglot页面预期使用与HTML相同的语义。因此,也应该仅使用标记而不使用CSS。

application/xmltext/xml形式提供的通用XML标记和XHTML

通常,用户代理不会自动识别或知道如何处理你在XML文档中使用的任何双向文本标记。因此,应该使用CSS属性来指示文档中文本的预期视觉行为。

但是,CSS应该始终链接到文本中的专用双向文本标记。

请参阅HTML规范中的15.3.5双向文本部分,了解用于HTML标记的样式。此标记为在XML应用程序中定义标记提供了良好的模型。特别要注意,CSS应用了unicode-bidiisolate值(对于bdo则是isolate-override)。强烈建议对所有带有dir(或等效)属性的元素使用这种方式,而不是简单的嵌入。(参见HTML中的内联标记和双向文本了解原因。)

双向样式可以在单独的样式表中定义,并把这个样式表包含在你的其他样式表或文档中。这简化了样式表的开发,并强化了双向和其他样式之间的区别。将双向样式表视为schema信息的一部分,它定义了特定双向标记的含义,而不是存在各种变体的装饰性样式。

其他信息

在HTML和其他基于XML的标记语言中,存在文本出现在属性中或仅支持字符数据的元素中的情况。标记和CSS都不能用于修改属性文本或仅支持字符数据的元素中部分文本的方向性。在这些情况下,你需要使用Unicode方向格式化代码。(有关更多详细信息,请参阅使用Unicode控制符处理双向文本。)