BiDi 算法详解及应用(一)

在开始本节内容之前,先对这个系列做一个简要的说明,在此系列里面会详细介绍以下几点内容:

什么是BiDiUnicode 的 BiDi 算法详解ICU 对算法的实现和工业级应用Html4 和 Html5 对 BiDi 支持及对应的控制元素和节点BiDi 内容的排版
什么是 BiDi ? 在聊什么是BiDi之前,咱们先唠唠是什么是文字。
IBM Terminology 中的定义:文字是使用于书面语的图形符号的集合。文字和语言或者国家/地区并不是一对一的关系。相同语系中的成员也可能使用不同的文字。例如,大部分的西欧语言都使用拉丁文,同样,阿拉伯文字不仅在阿拉伯国家中广泛使用而且也被用于伊朗的波斯语和巴基斯坦的乌尔都语。

从上面的定义中我们可以了解到,文字和语言实际上是混杂的关系。一种文字可以被多种语言所使用,比如拉丁文。而另一方面,一种语言可能使用多种文字来表述,比如日语,它使用了日语汉字、平假名、片假名三种文字系统,而且还可以使用拉丁文来表述。
那书写方向和文字、语言有怎样的关系呢?严格来说,书写方向是与文字相关的,而与语言没有多大关系。一种语言可以使用多种文字来表述,那同一种语言的书写方向就会因为所使用文字的不同而变化。比较经典的例子是阿塞拜疆语,它可以使用拉丁文字、西里尔文字和阿拉伯文字进行表述。当拉丁文字和西里尔文字被使用时,它的书写方向是从左到右,而当其使用阿拉伯文字时,书写方向就会变成从右到左。
文字的方向是多种多样的。多数的文字采用的是从左到右书写,而行的顺序是从上到下。而阿拉伯文字和希伯来文字等采用的是从右到左书写方向。我们当然还能很容易的想到,古代汉字的书写方向是从上到下,而行的顺序是从右到左。我们可以想象,如果现代汉字仍然采用古代的书写方向,这会让我们的 Web 工程师在设计页面方向和布局时是多么无奈啊!
在现代计算机应用中,最常用来处理双向文字的算法是 Unicode 双向算法(Unicode Bidirectional Algorithm),在后面的文章中我们将 Unicode 双向算法简称为 bidi 算法。该算法用来确认双向文字显示时的方向性。当然,除了方向性,该算法还涉及字形变化(Shaping)和镜像分析(Mirroring)等等其它和 bidi 相关的特性,不过这部分特性的实现大多由底层应用所控制,无需 Web 工程师进行设定或干预。

BiDi 算法是为了在计算机世界里实现 BiDi 效果的而产生的。 BiDi 算法用于指定文本的文字方向。 BiDi 文本是指通常在一段文本中包含两种文字方向,水平 LTR 方向(从左到右)的文本中包含 RTL 方向(从右到左)的文本,或是 RTL 方向的文本中包含 LTR 方向的文本,主方向称为全局方向。

使用 RTL 方向的语言主要是在中东地区,如阿拉伯语和希伯来语。在这些语言中全局方向是 RTL,但是文本中嵌入的数字和其它 LTR 方向语言的地址、缩写以及引用会使用 LTR 方向。实现 BiDi 算法和对字符串进行重排序的类库称为存储布局引擎(Storage Layout Engine)。

逻辑顺序(Logical Order)和视觉顺序(Visual Order)
逻辑顺序和视觉顺序是 BiDi 中两个重要的概念,逻辑顺序指的是人们阅读和从键盘上输入的文字顺序,文本在内存里也是以逻辑顺序存储的。视觉顺序则是文本在屏幕或是打印机中显示的顺序。

如下面的例子,小写字母代表英语等 LTR 方向语言,大写字母代表阿拉伯语等 RTL 方向语言,假设全局方向为 LTR 。

视觉顺序:English CIBARA text

逻辑顺序:English ARABIC text

在输入的时候采用逻辑顺序,由于全局方向是 LTR,因此以 LTR 方向将 English 输入和显示之后,输入 ARABIC 时会以 RTL 方向对文本进行显示,即 CIBARA,但是会以 ARABIC 的顺序进行存储。输入 text 时又会以 LTR 方式进行输入和显示。在显示或打印文本的时候,需要对文本进行重排序,将逻辑顺序转换为视觉顺序,某些文本以 LTR 方向显示,某些文本以 RTL 方向显示。 Unicode 标准规定了一种从逻辑顺序到视觉顺序的转换算法,通常以整个段落作为输入,屏幕的换行也会影响 BiDi 算法输出文本的实际显示位置。重排序算法的输出也用于光标的移动和选择。
除了显示文本以外,Unicode 对于计算机内部文本的处理,如拷贝,排序,查找等,都是以逻辑顺序处理的。这些操作依赖于字符匹配的顺序,因此必须以统一的顺序进行存储和处理。有的遗留系统为了避免在显示的时候对文本重排序,以视觉顺序对文本进行存储,在跟这些系统交换数据的时候,需要将数据从视觉顺序转换为逻辑顺序或是从逻辑顺序转换为视觉顺序。这种不是为了显示目的的转换称为存储布局转换(Storage Layout transformation)。
除了对键盘 , Locale, 字体等 NLS(National Language Support)基本的支持之外,BiDi 还支持:Text reordering, Shaping, Geometry mirroring, Right_to_Left geometry

本章节只是对 BiDi 从概念上做了一个简介,大家需要理解的是逻辑顺序(Logical Order)和视觉顺序(Visual Order)这两个重要的概念。在后面的章节会反复提及,也是理解的关键。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注