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

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

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

文字、语言和方向在开始介绍 bidi 算法和其在 HTML 中的实现之前,我们先来了解一下文字、语言和方向的关系,这也将有助于在后文中更好地理解 bidi 算法。
什么是文字和语言呢?我们引用 IBM Terminology 中的定义:
  • 文字是使用于书面语的图形符号的集合。文字和语言或者国家/地区并不是一对一的关系。相同语系中的成员也可能使用不同的文字。例如,大部分的西欧语言都使用拉丁文,同样,阿拉伯文字不仅在阿拉伯国家中广泛使用而且也被用于伊朗的波斯语和巴基斯坦的乌尔都语。
  • 而语言是指用于交流信息的一套字符、惯例和规则的集合。
从上面的定义中我们可以了解到,文字和语言实际上是多对多的关系。一种文字可以被多种语言所使用,比如拉丁文。而另一方面,一种语言可能使用多种文字来表述,比如日语,它使用了日语汉字、平假名、片假名三种文字系统,而且还可以使用拉丁文来表述。
那书写方向和文字、语言有怎样的关系呢?严格来说,书写方向是与文字相关的,而与语言没有多大关系。就像上文中所谈到的,一种语言可以使用多种文字来表述,那同一种语言的书写方向就会因为所使用文字的不同而变化。比较经典的例子是阿塞拜疆语,它可以使用拉丁文字、西里尔文字和阿拉伯文字进行表述。当拉丁文字和西里尔文字被使用时,它的书写方向是从左到右,而当其使用阿拉伯文字时,书写方向就会变成从右到左。
文字的方向是多种多样的。多数的文字采用的是从左到右书写,而行的顺序是从上到下。而阿拉伯文字和希伯来文字等采用的是从右到左书写方向。我们当然还能很容易的想到,古代汉字的书写方向是从上到下,而行的顺序是从右到左。我们可以想象,如果现代汉字仍然采用古代的书写方向,这会让我们的 Web 工程师在设计页面方向和布局时是多么苦恼啊!
一般而言,当人们谈到从右到左的文字时,会首先联想到阿拉伯文字和希伯来文字。当然,还有一些其他的文字也是从右到左书写的,比如古叙利亚文字。而从左到右书写的文字主要包括拉丁文、西里尔文、希腊文等等。另外,形意文字(如中文、日文和韩文中使用的文字)一般也是按照从左到右的顺序书写,不过有时候也会出现其他的书写方向,就像前文介绍的汉字那样。
本文中将介绍的 bidi 实际是英文单词 bidirectional (双向)的缩写,进一步来说,我们这里所说的 bidi 是指双向文字。顾名思义,双向文字是指同时包含了两种书写方向的文字,也就是从左到右和从右到左的文字同时存在。一般来说,这种情况多数存在于从右向左书写的文字中,比如,阿拉伯文字和希伯来文字,这些文字中字母的书写顺序是从右到左的,但当其中包含数字(实际上阿拉伯数字是起源于印度的)或拉丁文字(如英文字母)时,数字和拉丁文字部分的书写顺序就会变成从左到右。同样,从左到右书写英文字母时遇到阿拉伯文字,那阿拉伯文字的部分就会按照从右到左来书写。
因此,对于全球化 Web 工程师来说,了解页面文字的方向性非常重要。因为显示双向的文字更为复杂,而正确地显示文字的方向是正确理解文字的基础,不同的方向可能会导致理解上的不一致。同时,页面的组织和排版也会受到阅读方向的影响。从下面的例子中您或许就能理解文字方向的重要性了(在该例子中,用大写英文字母表示从右到左的文字,而小写英文字母用来表示从左到右的文字。下文中的例子都将使用这种模式。):
John does not believe TAHT YAS SYAWLA I.
当我们从左到右来阅读时,这个句子是“John does not believe I always say that.”,而如果从右到左来阅读这个句子,它就变成了“I always say that John does not believe.”。两个方向从语义上来说都是合适的,所以当不清楚这个句子的阅读方向时,就无法确定它真正要表达的意思。
Unicode 双向算法介绍在现代计算机应用中,最常用来处理双向文字的算法是 Unicode 双向算法(Unicode Bidirectional Algorithm),在后面的文章中我们将 Unicode 双向算法简称为 bidi 算法。该算法用来确认双向文字显示时的方向性。当然,除了方向性,该算法还涉及字形变化(Shaping)和镜像分析(Mirroring)等等其它和 bidi 相关的特性,不过这部分特性的实现大多由底层应用所控制,无需 Web 工程师进行设定或干预。
我们在此文中并不会详细解析 Unicode 双向算法,就如刚才所说,该算法的大部分内容将由底层实现。这个段落中,您将了解到 bidi 算法的一些核心的或和 Web 开发相关的概念,以便更好地在后面理解 HTML 中和 bidi 相关的设定是在改变或控制着什么特性。
双向字符类型(Bidirectional Character Types)正如前文介绍的,书写方向是和文字相关,阿拉伯文字从右到左,拉丁文字从左到右。当人们在纸上书写时当然会记得这些规则,那计算机是如何知道的呢?实际上,Unicode 定义了它其中每个字符的方向属性,计算机就是根据这个方向属性来判断该文字的方向。
Unicode 方向属性包含三种类型:强字符、弱字符和中性字符。在这三种主要类型下面还有很多细小的属性分类。大部分的字符都属于强字符,比如英文字母、汉字和阿拉伯字母。它们的方向性是确定的,从左到右或者从右到左,和其上下文的 bidi 属性无关。并且,强字符在 bidi 算法中可能会影响其前后字符的方向性。中性字符的方向性是不确定的,由上下文的 bidi 属性来决定其方向,比如大部分的标点符号和空格。有意思的是弱字符的特性,它们的方向是确定的,但对其前后字符的方向性并不会产生影响。数字和数字相关的一些符号就属于弱字符。
基础方向(Base Direction)或者也称为全局方向(Global Direction)、页面方向、段落方向,定义的是一个区域内的总体方向,比如一个页面、一个段落或者一个句子的方向。它决定了应该从这个区域的哪边开始书写文字。比如,当某个区域内的双向文字主要是从右到左的文字,并包含了从左到右的文字时,该区域的全局方向一般为从右到左,那么,第一个文字的输入位置就会在该区域的最右侧。
方向串(Directional Run)方向串是指在一段文字中具有相同方向性的连续字符,并且其前后没有相同方向性的其它方向串。请参考一下关于方向串的例子:
图1. 关于方向串的例子在这个例子中,包含了三个方向串。该句子以从左到右的方向串开始,然后是从右到左的方向串,最后以从左到右的方向串结尾。
要注意的是,方向串的排列顺序和数目往往会受到全局方向的影响。上面的例子中采用是从左到右的全局方向,如果该全局方向变为从右到左,那这个例句中方向串的排列顺序将如下图所示:
图2. 方向串的排列顺序在从左到右的全局方向中,第一个方向串将从最右侧开始,在最左侧结束。可能您也观察到方向串的个数从之前的三变成了四,句子结尾处的句号的方向性随着全局方向的变化也发生了变化。这同时也说明了中性字符(这个句号)的方向性会受到上下文 bidi 属性的影响。
返回列表