在国际化大潮流之下,很多嵌入式系统产品,需要支持阿拉伯语言,可很多人却为之烦恼,我遇到了同样的烦恼,因此在网上搜索了很多关于阿拉伯字库及阿拉伯语言显示的资料,经过实战,整理了这篇文章、资料。

阿拉伯语言显示的难点、痛点:

  1. 不知阿拉伯文的排版规则 (连写变形规则)。
  2. 没法找到支持阿拉伯文的字库。

在此我将为大家一一解决上述问题。

一。 阿拉伯文的排版规则。
阿拉伯语属阿非罗-亚细亚语系(闪含语系)闪语族。词一般由3个原生字母构成,可添加前缀,后缀,或使词的内部音位发生变化和插入其它音位构成新词。

阿拉伯共有28个字母,都是辅音字母,每个字母只代表一个辅音音素,每个音素只用一个字母表示。对应unicode:0x060C–0x06FE。

阿拉伯语共有8个元音,3个短元音,3个长元音和2个半元音,短元音是用加在辅音字母上面或下面的符号来表示。这些符号称为“动符”;长元音和软音是用动符和3个辅音字母来表示的。阿拉伯语发音符号共有12个(叠音符号不算在内)。普通书报上不加符号。

阿拉伯文字在伊斯兰教的影响下流传很广。波斯文,乌尔都文以及我国的新疆的维吾尔文等多种文字采用阿拉伯字母。阿拉伯文的字母没有大写和小写的区分,但有印刷体和书写体的区别,而且除去د ذ ر ز و五个字母以外,其他23个字母都可以和后面的字母连写,而且因其在词头,词中和词尾的位置不同,字形也有所变化。阿拉伯文字的书写方向和中文不同,它是自右向左横着写。因此,阿拉伯文的书籍和本子都是右开本的。

在换行的时候,一般的,我们需要判断一下是否是整个词,进行整个词的换行,而不能把词拆成两个部分。阿拉伯文里面的数字仍然采用从左往右的显示方式

规则1。
阿拉伯文变形:
根据上面分法,分成first,last,middle,alone,并根据判断是否是词的前连(前面字符在集合1中),后连(后面字符在集合2中),中间(即前后连,前面字符在集合1中,后面字符在集合2中)或单独一个词,进行变形。
据分析,给出变形的数组:分别对应上面的情况。对于其它不在数组中的,其变形和自身相同。

const WORD Arbic_Position[][4]= // first, last, middle, alone

{

{ 0xfe80, 0xfe80, 0xfe80, 0xfe80}, // 0x621

{ 0xfe82, 0xfe81, 0xfe82, 0xfe81},

{ 0xfe84, 0xfe83, 0xfe84, 0xfe83},

{ 0xfe86, 0xfe85, 0xfe86, 0xfe85},

{ 0xfe88, 0xfe87, 0xfe88, 0xfe87},

{ 0xfe8a, 0xfe8b, 0xfe8c, 0xfe89},

{ 0xfe8e, 0xfe8d, 0xfe8e, 0xfe8d},

{ 0xfe90, 0xfe91, 0xfe92, 0xfe8f}, // 0x628

{ 0xfe94, 0xfe93, 0xfe94, 0xfe93},

{ 0xfe96, 0xfe97, 0xfe98, 0xfe95}, // 0x62A

{ 0xfe9a, 0xfe9b, 0xfe9c, 0xfe99},

{ 0xfe9e, 0xfe9f, 0xfea0, 0xfe9d},

{ 0xfea2, 0xfea3, 0xfea4, 0xfea1},

{ 0xfea6, 0xfea7, 0xfea8, 0xfea5},

{ 0xfeaa, 0xfea9, 0xfeaa, 0xfea9},

{ 0xfeac, 0xfeab, 0xfeac, 0xfeab}, // 0x630

{ 0xfeae, 0xfead, 0xfeae, 0xfead},

{ 0xfeb0, 0xfeaf, 0xfeb0, 0xfeaf},

{ 0xfeb2, 0xfeb3, 0xfeb4, 0xfeb1},

{ 0xfeb6, 0xfeb7, 0xfeb8, 0xfeb5},

{ 0xfeba, 0xfebb, 0xfebc, 0xfeb9},

{ 0xfebe, 0xfebf, 0xfec0, 0xfebd},

{ 0xfec2, 0xfec3, 0xfec4, 0xfec1},

{ 0xfec6, 0xfec7, 0xfec8, 0xfec5}, // 0x638

{ 0xfeca, 0xfecb, 0xfecc, 0xfec9},

{ 0xfece, 0xfecf, 0xfed0, 0xfecd}, //0x63A

{ 0x63b, 0x63b, 0x63b, 0x63b},

{ 0x63c, 0x63c, 0x63c, 0x63c},

{ 0x63d, 0x63d, 0x63d, 0x63d},

{ 0x63e, 0x63e, 0x63e, 0x63e},

{ 0x63f, 0x63f, 0x63f, 0x63f},

{ 0x640, 0x640, 0x640, 0x640}, // 0x640

{ 0xfed2, 0xfed3, 0xfed4, 0xfed1},

{ 0xfed6, 0xfed7, 0xfed8, 0xfed5},

{ 0xfeda, 0xfedb, 0xfedc, 0xfed9},

{ 0xfede, 0xfedf, 0xfee0, 0xfedd},

{ 0xfee2, 0xfee3, 0xfee4, 0xfee1},

{ 0xfee6, 0xfee7, 0xfee8, 0xfee5},

{ 0xfeea, 0xfeeb, 0xfeec, 0xfee9},

{ 0xfeee, 0xfeed, 0xfeee, 0xfeed}, // 0x648

{ 0xfef0, 0xfef3, 0xfef4, 0xfeef},

{0xfef2, 0xfef3, 0xfef4, 0xfef1}, // 0x64A

};

判断是否是连接前面的,采用判断该字符前一个字符的判定方法,方法是,看前一个字符是否在集合set1中。如果在,则是有连接前面的。集合1如下:
static U16 theSet1[23]={
0x62c, 0x62d, 0x62e, 0x647, 0x639, 0x63a, 0x641, 0x642,
0x62b, 0x635, 0x636, 0x637, 0x643, 0x645, 0x646, 0x62a,
0x644, 0x628, 0x64a, 0x633, 0x634, 0x638, 0x626, 0x640}; // 0x640新增

判断是否是连接后面的,采用判断该字符后一个字符的判定方法,方法是,看后一个字符是否在集合set2中。如果在,则是有连接后面的。集合2如下:
static U16 theSet2[35]={
0x62c, 0x62d, 0x62e, 0x647, 0x639, 0x63a, 0x641, 0x642,
0x62b, 0x635, 0x636, 0x637, 0x643, 0x645, 0x646, 0x62a,
0x644, 0x628, 0x64a, 0x633, 0x634, 0x638, 0x626,
0x627, 0x623, 0x625, 0x622, 0x62f, 0x630, 0x631, 0x632,
0x648, 0x624, 0x629, 0x649, 0x640}; // 0x640 新增

规则2。
阿拉伯文连字符规则:
连字符是以0x644开头,后面跟的是0x622,0x623,0x625,0x627,并根据情况取下面的字符数组0或1,如果0x644前一个字符是在集合1(同上面的集合1)中间,那么取数组1,否则取数组0。
数组如下:
static U16 arabic_specs[][2]=
{
{0xFEF5,0xFEF6},
{0xFEF7,0xFEF8},
{0xFEF9,0xFEFA},
{0xFEFB,0xFEFC},
};

例1: 0x064A, 0x0644, 0x0622。。。
0x064A 的后面一个字符 0x0644 在集合2中,根据编码规则1得出它是后连字符(last),故转换成: 0xFEF3.

二。 阿拉伯文字库。
1、点阵字库:低端嵌入式平台阿拉伯文字库生成工具— GuiTool(未验证可行性)
2、ttf字库:ttf字库是矢量字体,缩放不会有锯齿,ttf字库基本都有版权,因此,一般需要取得字库的版权才能商用于产品。那么,有时候拿到ttf字库后,发现阿拉伯语还是显示不全或者显示乱码,这个时候就需要了解阿拉伯文的编码范围了,如下:

阿拉伯文的Unicode编码范围(共三段):
0600-06FF:阿拉伯文 (Arabic)
FB50-FDFF:阿拉伯表達形式A (Arabic Presentation Form-A)
FE70-FEFF:阿拉伯表達形式B (Arabic Presentation Form-B)

如果阿拉伯语显示不全或者乱码,可以使用Font Creator Program工具打开ttf字库,查看是不是缺失了某些字符,目前很多人对阿拉伯文的编码范围不太了解,故生成字库的unicode编码信息只涵盖了第一段 0600-06FF,另外两段FB50-FDFF、 FE70-FEFF完全缺失或部分缺失,故无法正确支持阿拉伯文显示。由于连写规则会将第一段中的某些编码转换成第三段中编码. 详见上面写的 阿拉伯文排版规则。如果FB50-FDFF、 FE70-FEFF两段缺失,可以使用*Font Creator Program工具编辑字库,根据上面提到的排版规则或者用肉眼看字形将 0600-06FF里面有的字符复制到FB50-FDFF、 FE70-FEFF两段,同时编辑其unicode编码。

参考文章:
1、http://blog.sina.com.cn/s/blog_5d8cc6410100tggx.html
2、http://blog.sina.com.cn/s/blog_5d8cc6410100s2v1.html
3、https://blog.csdn.net/xzl04/article/details/6307416?spm=1001.2014.3001.5506

推荐字库工具:
1、Font Creator Program工具,中文版,免费使用,就是显示比较模糊;
2、FontLab 高清显示字体字模(我不太会用,上面的工具好用点,但显示没这个清晰)

免费商用字库下载:(目前发现阿拉伯字库存在缺失情况,然后就可以使用上面说的工具+方法完善字库)
https://fonts.google.com/

嵌入式产品如何支持阿拉伯文显示---看这一篇就够了相关推荐

  1. 深度好文:云网络丢包故障定位,看这一篇就够了~

    深度好文:云网络丢包故障定位,看这一篇就够了~ https://mp.weixin.qq.com/s/-Q1AkxUr9xzGKwUMV-FQhQ Alex 高效运维 今天 来源:本文经授权转自公众号 ...

  2. docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...

    紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...

  3. 聊聊Java8之后的JDK升级内容(看这一篇就够了)

    聊聊Java8之后的JDK升级内容(看这一篇就够了) 背景 从 JDK 8 到 JDK 17 的新特性 JDK8 回顾 JDK9 JDK10 JDK11 JDK12 JDK13 JDK14 JDK15 ...

  4. api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)

    如何轻松打造百亿流量API网关?看这一篇就够了(上) 上篇整体描述了网关的背景,涉及职能.分类.定位环节,本篇进入本文的重点,将会具体谈下百亿级流量API网关的演进过程. 准备好瓜子花生小板凳开始积累 ...

  5. 1盒子刷Armbian,看这一篇就够了——Armbian全方位安装指导书

    N1盒子刷Armbian,看这一篇就够了--Armbian全方位安装指导书 2020-03-30 19:04:11 72点赞 715收藏 122评论 创作立场声明:一个写完之后很累很累的年轻人 追加修 ...

  6. 如何应对大数据分析工程师面试Spark考察,看这一篇就够了

    作者丨斌迪.HappyMint 来源丨大数据与人工智能(ID:ai-big-data) [导读]本篇文章为大家带来spark面试指南,文内会有两种题型,问答题和代码题,题目大部分来自于网络上,有小部分 ...

  7. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了

    title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...

  8. OpenStack入门科普,看这一篇就够啦

    OpenStack入门科普,看这一篇就够啦 科技百分百 2019-07-06 10:06:00 作者 | 小枣君 来源 | 鲜枣课堂 大家好,我是小枣君. 最近几年,OpenStack这个词开始频繁出 ...

  9. minio存储类型 归档管理页面_软件定义存储,看这一篇就够了

    minio存储类型 归档管理页面_软件定义存储,看这一篇就够了_婷婷与li的博客-CSDN博客 请看链接 文章来源于TaoCloud ,作者刘爱贵 1.SDS科普 SDS(Software Defin ...

最新文章

  1. 连通性2 无向图的双连通 bcc
  2. 【组队学习】【24期】集成学习(中)
  3. jvm_堆栈永久区详细讲解
  4. Android存储Json到本地,和读取本地Json
  5. SpringCloudStream
  6. c语言怎么样文件存储数据,急求如何将下列C语言程序数据存储到文件中?
  7. 输出一行星花 1110 java
  8. Producing function in SQL.
  9. C#图片处理之: 另存为压缩质量可自己控制的JPEG
  10. mysql homedir迁移
  11. 计算机英语(王艺)译文(unit6-unit12)
  12. 10个精美免费PPT模板下载网站推荐
  13. 产品人的归宿 · 之 · 创业维艰
  14. 神威太湖之光入门指南
  15. Loadrunner11安装及globa-10000配置
  16. LeNet-5网络结构解析
  17. FastDB 很难得的一篇分析
  18. Android 源码目录结构
  19. Springcloud快速入门
  20. u盘插到电脑计算机里没有反应,U盘插入电脑没有反应 怎么查看是哪里坏了?

热门文章

  1. 贴纸拼词--动态规划
  2. ubuntu18.04-ros-melodic-carlar安装教程详细指南
  3. Proxmox VE 桌面虚拟化(windows 10)集群尝试
  4. Cocos2dx版本介绍【至3.10版】
  5. 信奥中的数学:质数与合数
  6. Helm 创建一个NOTES.txt文件
  7. 大恒相机MER-302-56U3M在Linux环境下采集图像
  8. 【k8s】重启kubelet、查看所有服务
  9. 一年两款新品 寒武纪的研发效率为何如此高?
  10. C# 景深融合软件(opencvsharp开源库)