首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

bidi 算法及 HTML 中的实现(2)

bidi 算法及 HTML 中的实现(2)

关于方向的 Unicode 控制字符大部分情况,Unicode 双向算法能根据字符属性和全局方向等信息运算并正确地显示双向文字,这是该算法的隐性模式。在这种模式下,双向文字的显示方式基本上由算法完成,不需要人为的干预。但是,隐性模式的算法在处理复杂情况的双向文字时会显得不足,这时就可以使用显性模式来进行补充。在显性模式的算法中,除了隐性算法的运算外,可以在双向文字中加入关于方向的 Unicode 控制字符来控制文字的显示。这些被加入文字中的 Unicode 控制字符在显示界面上是不可见的,也不占用任何显示空间。它们只是在默默地影响着双向文字的显示。
Unicode 控制字符又可以分为两类,第一类为隐性双向控制字符:
1
2
U+200E:   LEFT-TO-RIGHT MARK (LRM)
U+200F:   RIGHT-TO-LEFT MARK (RLM)




简单来说,您可以将这类的控制字符看成是不会显示出来的强字符,LRM 为从左到右的强字符,而 RLM 为从右到左的强字符。
而第二类当然就是显性双向控制字符:
1
2
3
4
5
U+202A:   LEFT-TO-RIGHT EMBEDDING (LRE)
U+202B:   RIGHT-TO-LEFT EMBEDDING (RLE)
U+202D:   LEFT-TO-RIGHT OVERRIDE (LRO)
U+202E:   RIGHT-TO-LEFT OVERRIDE (RLO)
U+202C:   POP DIRECTIONAL FORMATTING (PDF)




这类控制字符需要成对使用,列表中的前四个为开始字符,而最后一个为结束字符。当双向算法遇到 LRE 时,接下来文字片段内的方向开始变为从左到右。当双向算法遇到 RLE 时,接下来文字片段内的方向开始变为从右到左。当遇到 LRO 时,双向算法会将后面所有文字的双向属性视为从左到右强字符。当遇到 RLO 时,双向算法会将后面所有文字的双向属性视为从右到左强字符。如果一旦遇到 PDF 字符,双向属性的状态就会恢复到最后一个 LRE、RLE、LRO 或 RLO 之前的状态。
如何使用这些关于方向的 Unicode 控制字符,您可以参见后面使用 HTML 元素的例子。
关于方向的 HTML 元素在 HTML 中除了可以使用那些关于方向的 Unicode 控制字符,还可以使用 HTML 中提供的标签或者属性来控制双向文字的显示。而且,当可以使用标签或者属性时,建议使用这些 HTML 元素来控制方向,而不使用Unicode 控制字符。最主要的原因是 Unicode 控制字符是不可见的,在使用和维护时容易出现问题,而 HTML元素可以避免这个问题。
属性 dir与 LRE 控制字符和 RLE 控制字符相对应的 HTML 元素是 dir = "ltr" 和 dir = "rtl" (ltr 的英文全称为 left to right,而 rtl 的英文全称为 right to left)这两个属性,它们就像其他的属性一样,可以被用在块级元素或内联元素中,并控制该区域的方向性。属性 dir 这个关键字就是英文单词 direction (方向)的缩写。实际上,这个属性控制的就是相应元素内的全局方向。
HTML5 中给 dir 属性加入了一个新的值“auto”。这个值与上面提到的 ltr 和 rtl 不同,它并不明确相应元素内的全局方向,而需要根据不同的情况进行判断。这个判断依据就是该元素内的第一个强字符。如果第一个强字符是从左到右的属性,那么 dir="auto" 的结果就等于 dir="ltr"。同理,如果第一个强字符是从右到左的属性,那么 dir="auto" 的结果就等于 dir="rtl"。需要注意的是,这里的判断条件的第一个强字符,而会忽略之前遇到的弱字符和中性字符。这种模式可以被称为自动方向性或者上下文方向性。
标签 <bdo>而与 LRO 控制字符和 RLO 控制字符相对应的 HTML 元素分别为:
1
2
<bdo dir = "rtl"></bdo>
<bdo dir = "ltr"></bdo>




其中,<bdo dir = "rtl"> 和 <bdo dir = "ltr"> 相当于 LRO 控制字符和 RLO 控制字符,表示一段控制区域的开始。而 </bdo> 的作用就像是 PDF 控制字符,表示此控制区域的结束。该标签根据 dir 属性覆盖相应元素内的字符方向性。
关键字 bdo 的英文全称为 bidirectional override (双向性超控)。需要注意的是,在这个标签中的 dir 属性不能赋值为 auto。
标签 <bdi>HTML5 还加入了一个新的元素,那就是标签 <bdi>,它的英文全称为 bidirectional isolate (bidi 隔离,笔者觉得翻译成双向性片段会比较合适)。该标签用来在双向文字中加入方向片段,使得该片段脱离其父元素的全局方向。有点类似于 <span> 标签的作用,但不同的是 <bdi> 标签本身带有默认方向属性。
<bdi> 标签中可以使用 dir 属性来指定方向性,但默认情况下该属性的值为 auto。也就是说,使用 <bdi>...</bdi> 的结果和使用 <bdi dir="auto">...</bdi> 是一样的。
当您无法预知要显示内容的方向性时,建议使用此标签,比如用户的输入。让该区域根据上下文来判断优先使用的方向。
关于方向的 HTML 实体还需要说明的是,隐性双向控制字符 LRM 和 RLM 并没有与之相对应的 HTML 元素,不过建议使用 HTML 实体来代替 Unicode 控制字符。至少在编辑器中,这些 HTML 实体是可见的。
表1. 关于方向的 HTML 实体Unicode 控制字符HTML 实体作用LEFT-TO-RIGHT MARK (LRM)&lrm;从左到右强字符RIGHT-TO-LEFT MARK (RLM)&rlm;从右到左强字符
返回列表