bidi 算法

逻辑顺序与视觉顺序

[I] 逻辑顺序:指人们阅读和从键盘上输入的文字顺序,文本在内存里也是以逻辑顺序存储的。
[II] 视觉顺序:则是文本在屏幕或是打印机中显示的顺序。

字符类型

[I] 阿拉伯文、希伯来文及其派生语言的本土字符为“强RTL字符”
[II] 我们通常见到的中文、英文等语言的本土字符为“强LTR字符”
[III] 欧洲数字、东方阿拉伯,数字,逗号,冒号,句号(即小数点)等为“弱字符”
[IV] 括号,中括号,尖括号,空格符,大多数标点符号为“中性字符”

image-20230818153319225

规则

bidi算法具体规则十分复杂,

但其基本规则应做了解:

  1. 文本的全局方向取决于句子中首个强字符
  2. 确定了文本的全局显示方向后,若局部出现了反向字符,则连续的反向字符保持其局部顺序
    e.g: 若在连续的阿拉伯文中出现了中文单词,如”奔跑吧”,则其仍按照中文顺序显示,不会显示为”吧跑奔”
  3. 弱字符保持自身方向
  4. 没有被强字符包裹的中性字符追随全局方向

有时,这会导致意外显示错误,这些错误可以通过使用“定向格式化字符”来预防。

image-20230818153546857

参考:https://zhuanlan.zhihu.com/p/392525771

方向串
方向串是指在一段文字中具有相同方向性的连续字符,并且其前后没有相同方向性的其它方向串。如以下例子:

1
2
3
4
<p>phone:(415)555-3695</p>
<p>هاتف:(415)555-3695</p>
<p dir="ltr">هاتف:(415)555-3695</p>
<p dir="rtl">هاتف:(415)555-3695</p>

在这里插入图片描述

我们可以看到,含有阿拉伯文字的段落,电话号码好像按符号分割分组反方向显示了。但实际上并非故意这样输入的,而是电话号码输入完成后再在电话号码前加上阿拉伯文字之后就变成这样了。

文中首个强类型字符是阿拉伯文字,因此其所在的文本区域的全局方向为RTL,但弱类型的数字则保持了原方向LTR,而中性字符”😦)-“没有被强字符包围则跟随了全局方向。

方向串

对于以上含有阿拉伯文字的段落,我们可以得到6个不同的方向串。正是因为中性符号被全局方向影响,使得原本的号码被拆分成不同的方向串,从而重新排列。

原文链接:https://blog.csdn.net/qq_40834030/article/details/105111971

Author

white crow

Posted on

2023-07-12

Updated on

2024-04-24

Licensed under