BiDi 算法详解及应用(一)
来源:互联网 发布:js 判断是否隐藏 编辑:程序博客网 时间:2024/06/07 07:10
在开始本节内容之前,先对这个系列做一个简要的说明,在此系列里面会详细介绍以下几点内容:
- 什么是BiDi
- Unicode 的 BiDi 算法详解
- ICU 对算法的实现和工业级应用
- Html4 和 Html5 对 BiDi 支持及对应的控制元素和节点
- BiDi 内容的排版
什么是 BiDi ?
在聊什么是BiDi之前,咱们先唠唠是什么是文字。
IBM Terminology 中的定义:文字是使用于书面语的图形符号的集合。文字和语言或者国家/地区并不是一对一的关系。相同语系中的成员也可能使用不同的文字。例如,大部分的西欧语言都使用拉丁文,同样,阿拉伯文字不仅在阿拉伯国家中广泛使用而且也被用于伊朗的波斯语和巴基斯坦的乌尔都语。
从上面的定义中我们可以了解到,文字和语言实际上是混杂的关系。一种文字可以被多种语言所使用,比如拉丁文。而另一方面,一种语言可能使用多种文字来表述,比如日语,它使用了日语汉字、平假名、片假名三种文字系统,而且还可以使用拉丁文来表述。
那书写方向和文字、语言有怎样的关系呢?严格来说,书写方向是与文字相关的,而与语言没有多大关系。一种语言可以使用多种文字来表述,那同一种语言的书写方向就会因为所使用文字的不同而变化。比较经典的例子是阿塞拜疆语,它可以使用拉丁文字、西里尔文字和阿拉伯文字进行表述。当拉丁文字和西里尔文字被使用时,它的书写方向是从左到右,而当其使用阿拉伯文字时,书写方向就会变成从右到左。
那书写方向和文字、语言有怎样的关系呢?严格来说,书写方向是与文字相关的,而与语言没有多大关系。一种语言可以使用多种文字来表述,那同一种语言的书写方向就会因为所使用文字的不同而变化。比较经典的例子是阿塞拜疆语,它可以使用拉丁文字、西里尔文字和阿拉伯文字进行表述。当拉丁文字和西里尔文字被使用时,它的书写方向是从左到右,而当其使用阿拉伯文字时,书写方向就会变成从右到左。
文字的方向是多种多样的。多数的文字采用的是从左到右书写,而行的顺序是从上到下。而阿拉伯文字和希伯来文字等采用的是从右到左书写方向。我们当然还能很容易的想到,古代汉字的书写方向是从上到下,而行的顺序是从右到左。我们可以想象,如果现代汉字仍然采用古代的书写方向,这会让我们的 Web 工程师在设计页面方向和布局时是多么无奈啊!
在现代计算机应用中,最常用来处理双向文字的算法是 Unicode 双向算法(Unicode Bidirectional Algorithm),在后面的文章中我们将 Unicode 双向算法简称为 bidi 算法。该算法用来确认双向文字显示时的方向性。当然,除了方向性,该算法还涉及字形变化(Shaping)和镜像分析(Mirroring)等等其它和 bidi 相关的特性,不过这部分特性的实现大多由底层应用所控制,无需 Web 工程师进行设定或干预。
使用 RTL 方向的语言主要是在中东地区,如阿拉伯语和希伯来语。在这些语言中全局方向是 RTL,但是文本中嵌入的数字和其它 LTR 方向语言的地址、缩写以及引用会使用 LTR 方向。实现 BiDi 算法和对字符串进行重排序的类库称为存储布局引擎(Storage Layout Engine)。
逻辑顺序(Logical Order)和视觉顺序(Visual Order)逻辑顺序和视觉顺序是 BiDi 中两个重要的概念,逻辑顺序指的是人们阅读和从键盘上输入的文字顺序,文本在内存里也是以逻辑顺序存储的。视觉顺序则是文本在屏幕或是打印机中显示的顺序。
如下面的例子,小写字母代表英语等 LTR 方向语言,大写字母代表阿拉伯语等 RTL 方向语言,假设全局方向为 LTR 。
逻辑顺序:English ARABIC text
除了显示文本以外,Unicode 对于计算机内部文本的处理,如拷贝,排序,查找等,都是以逻辑顺序处理的。这些操作依赖于字符匹配的顺序,因此必须以统一的顺序进行存储和处理。有的遗留系统为了避免在显示的时候对文本重排序,以视觉顺序对文本进行存储,在跟这些系统交换数据的时候,需要将数据从视觉顺序转换为逻辑顺序或是从逻辑顺序转换为视觉顺序。这种不是为了显示目的的转换称为存储布局转换(Storage Layout transformation)。
除了对键盘 , Locale, 字体等 NLS(National Language Support)基本的支持之外,BiDi 还支持:Text reordering, Shaping, Geometry mirroring, Right_to_Left geometry
本章节只是对 BiDi 从概念上做了一个简介,大家需要理解的是逻辑顺序(Logical Order)和视觉顺序(Visual Order)这两个重要的概念。在后面的章节会反复提及,也是理解的关键。
1 0
- BiDi 算法详解及应用(一)
- BiDi 算法详解及应用(二)
- BiDi 算法的实现及应用
- bidi 算法及 HTML 中的实现
- BiDi 排版算法
- ICU4J BiDi算法实现
- BiDi 排版算法
- 密码学算法及应用(一)
- BIDI算法 (Unicode Bidirectional Algorithm)
- sift算法详解及应用
- DLX算法及应用(一)DLX模板+解数独
- (一)K近邻算法及MNIST应用
- xilinx vivado zynq vdma仿真及应用详解(一)
- Lucene (一)建立索引及应用的属性详解
- KMP算法详解及各种应用
- KMP算法详解及各种应用
- KMP算法详解及各种应用
- 详解FCM算法原理及应用
- gsoap使用总结
- Nginx切割日志
- Oracle学习记录
- mysql一些简单操作
- 粒子群优化算法
- BiDi 算法详解及应用(一)
- MVC 下载文件
- 快速生成SpringBootDemo程序
- Python note
- 【OVS2.5.0源码分析】datapath之action分析(6)
- 第0章 计算机概论
- FZU 2231 平行四边形数(几何)(思维)
- mina源码学习之创建IoAcceptor
- websocket在线测试网站