Arabic Alphabet Shape Table / 阿拉伯字母的变形程序
####阿拉伯语字母,除了用在阿拉伯语,还用在了波斯语等其它许多语言中,包括我国新疆维吾尔语。完全不懂阿拉伯语,为了在嵌入式设备上的程序,能处理阿拉伯语的变形问题,才收集一些资料学习。所有文字来自于网络上的资料加工编辑而成。
阿拉伯语的课本上,都是从阿拉伯语的语法、 词法甚至书法上,讲解阿拉伯语字母的变形问题,这种解释对于编写阿拉伯字母变形程序,基本上没有什么参考价值,或者说学习代价带太大了,不实用。不需要学懂阿拉伯语的这些语法规则,只要知道在计算机显示环境下,一个uincode的字符在何种上下文的条件下,变换成何种字符即可。
####学习的结论是,阿拉伯语优先考虑了书写视觉上要求,没有使用所见即所得的直观符号处理方式(看见的符号就是实际保存的符号),而是将阿拉伯字母渲染之后再显示。完整的渲染流程应该是:计算机在显示阿拉伯字母时,需要根据选择阿拉伯字母的书写风格和当前选择的字体,以及显示位置、书写空间的情况,将字母原型(不是字母原型似乎也能处理),经过Shape(字母位置变形)、Ligature(Combined)(字母连写变形 或称作结合变形)、Diacritics(字母标注变(元)音符号变形)、Kashida(为了凑满一整行字母延长变形)、Tatwell(插入字母链接符号)等等一系列的操作,才可以将一段阿拉伯字母渲染输出(Rendering),从右到左的排版,再与从左至右的字符混合排版后,显示出来。不能完全确定信息是:不同的地域语言,阿拉伯字母变形规则有可能有所不同。全部的变形规则中,最主要的变形是Shape和Ligature。如果用汉语来非常粗略的比喻阿拉伯语的连写变形规则,就好像一篇汉字文章在显示(书写的)的时候被要求,一定要把文字中的“不好”显示成“孬”,把“混凝土”显示成“砼”,把“不用”显示成“甭”...,。阿拉伯语是最难学习的语言之一。
####变形之后显示输出来的 Arabic Letter 字符虽然也是Unicode字符(Contextual forms),但是它们一般不使用Unicode编码表示,而是用预先设定的字体的glyph id表示,并且再附加上字体信息、格式信息,因为显示出来的字母有可能是几个字符叠加渲染出来的,所以字体信息、格式信息也很重要。在0x20**范围的一些Unicode字符,是格式控制字符和标注元音用的叠加字符。阿拉伯语字母为了视觉效果的渲染变形,有着多对一,多对多复杂的映射关系,完整全套的变形的处理功能(包括双向排版处理),绝非是一个小程序就可以实现的。但是还是有一些小程序,实现了(现代标准阿拉伯语的)阿拉伯语字母 Shape(位置变形) & Ligature(连写变形) 这2个最主要视觉变形功能,可以用在简单的设备显示阿拉伯字母。例如:
一些Gui库中,也有阿拉伯语字母的处理代码,例如:以往旧版MTK,ucGUI(emWIN)。
####下图是一些Arabic Alphabet Shape阿拉伯字母各种视觉渲染变形例子,来自网络上的资料截图,注意阿拉伯字母是从右至左阅读的:
位置变形:首位变形,末尾变形的例子
连接变形的例子:
标注元音的例子:
为了视觉效果,复杂的多种形态变形例子:
为了视觉效果(凑满一整行)延长变形的例子:
插入了延长字符的例子:
####字符变形之后, Shape & Ligature 变形导致字符Unicode编码变化的的例子:
####不是所有的代码编辑器,都能完全正确显示阿拉伯字符的,即便是完全支持阿拉伯字符的编辑器,对于不懂阿语的人来说,也难以自容的编辑阿拉伯字符。下表中,用英文字符o将它们包围起来,防止阿拉伯语字母显示的时候,自动发生各种变形。这个变形表,仅仅显示出了阿拉伯字母位置变形情况。
####阿拉伯字母位置变形表
o o 中是空白表示不变化。原型字母的Unicode是0x06**,变形字母Unicode是0xfe**
原型----独立-----在后-----在前-----中间
oءo , oﺀo , o o , o o , o o , Arabic letter Hamza oآo , oﺁo , oﺂo , o o , o o , Arabic letter Alef with Madda aboأo , oﺃo , oﺄo , o o , o o , Arabic letter Alef with Hamza aboؤo , oﺅo , oﺆo , o o , o o , Arabic letter Waw with Hamza abooإo , oﺇo , oﺈo , o o , o o , Arabic letter Alef with Hamza beoئo , oﺉo , oﺊo , oﺋo , oﺌo , Arabic letter Yeh with Hamza abooاo , oﺍo , oﺎo , o o , o o , Arabic letter Alef oبo , oﺏo , oﺐo , oﺑo , oﺒo , Arabic letter Beh oةo , oﺓo , oﺔo , o o , o o , Arabic letter Teh Marbuta oتo , oﺕo , oﺖo , oﺗo , oﺘo , Arabic letter Teh oثo , oﺙo , oﺚo , oﺛo , oﺜo , Arabic letter Theh oجo , oﺝo , oﺞo , oﺟo , oﺠo , Arabic letter Jeem oحo , oﺡo , oﺢo , oﺣo , oﺤo , Arabic letter Hah oخo , oﺥo , oﺦo , oﺧo , oﺨo , Arabic letter Khah oدo , oﺩo , oﺪo , o o , o o , Arabic letter Dal oذo , oﺫo , oﺬo , o o , o o , Arabic letter Thal oرo , oﺭo , oﺮo , o o , o o , Arabic letter Reh oزo , oﺯo , oﺰo , o o , o o , Arabic letter Zain oسo , oﺱo , oﺲo , oﺳo , oﺴo , Arabic letter Seen oشo , oﺵo , oﺶo , oﺷo , oﺸo , Arabic letter Sheen oصo , oﺹo , oﺺo , oﺻo , oﺼo , Arabic letter Sad oضo , oﺽo , oﺾo , oﺿo , oﻀo , Arabic letter Dad oطo , oﻁo , oﻂo , oﻃo , oﻄo , Arabic letter Tah oظo , oﻅo , oﻆo , oﻇo , oﻈo , Arabic letter Zah oعo , oﻉo , oﻊo , oﻋo , oﻌo , Arabic letter Ain oغo , oﻍo , oﻎo , oﻏo , oﻐo , Arabic letter Ghain oفo , oﻑo , oﻒo , oﻓo , oﻔo , Arabic letter Feh oقo , oﻕo , oﻖo , oﻗo , oﻘo , Arabic letter Qaf oكo , oﻙo , oﻚo , oﻛo , oﻜo , Arabic letter Kaf oلo , oﻝo , oﻞo , oﻟo , oﻠo , Arabic letter Lam oمo , oﻡo , oﻢo , oﻣo , oﻤo , Arabic letter Meem oنo , oﻥo , oﻦo , oﻧo , oﻨo , Arabic letter Noon oهo , oﻩo , oﻪo , oﻫo , oﻬo , Arabic letter Heh oوo , oﻭo , oﻮo , o o , o o , Arabic letter Waw oىo , oﻯo , oﻰo , o o , o o , Arabic letter Alef Maksura oيo , oﻱo , oﻲo , oﻳo , oﻴo , Arabic letter Yeh oپo , oﭖo , oﭗo , oﭘo , oﭙo , Eastern arabic letter Peh oچo , oﭺo , oﭻo , oﭼo , oﭽo , Eastern arabic letter Tcheh oژo , oﮊo , oﮋo , o o , o o , Eastern arabic letter Jeh oکo , oﮎo , oﮏo , oﮐo , oﮑo , Eastern arabic letter Keheh oگo , oﮒo , oﮓo , oﮔo , oﮕo , Eastern arabic letter Gaf oیo , oﯼo , oﯽo , o o , o o , Eastern arabic letter Farsi Yeh
可以将这些数据,导入到Excel表:
注意:空白表示不变(同“独立”),原型字母的Unicode是0x06**,变形字母Unicode是0xfe**
上面的数据来自于下面这个程序(C#)的源代码。 :
####编写程序,在程序种观察阿拉伯字位置变形和连写变形情况,这个程序还可以输入一个不正确的变形,看看微软是如何处理的。
####问题:获得了变形之后的字符串Unicode,和变形前的字符串Unicode,在比较函数中,如何认为它们是“相等”的?因为它们的确有着某种等价关系。
####测试一下网络上收集的各种阿拉伯字母变形处理程序,验证能否正确的处理位置变形和连写变形,对比发现有的程序是无法处理连写规则的,右边正确的连写变形,左边是出错的例子:
####连写规则表
LigaturesCharacter combinations of Lam and Alef are transformed into ligatures. The following tableshows how emWin transforms these combinations into ligatures, if the first letter is a Lam(code 0x0644 ):Second letter | Ligature (final) | Ligature (elsewhere)0x622 , Alef with Madda above | 0xFEF6 | 0xFEF50x623 , Alef with Hamza above | 0xFEF8 | 0xFEF70x625 , Alef with Hamza below | 0xFEFA | 0xFEF90x627 , Alef | 0xFEFC | 0xFEFB
####附录1:
其它一些收集的资料截图
阿拉伯字母位置变形规则
-------------------------------------------------------------------------------------------------------------------------------------------
阿拉伯字母连写变形规则 :
####知乎网上的资料:维吾尔语使用的阿拉伯语字母的情况,从中可以看出地域不同的差异。
####附录2
Arabic Shaping 程序例子:(来自网络)
编辑程序的时候,如果程序中有阿拉伯语字符串,程序员是不需要所谓的变形和逆序显示的。