最近在研究一些小语种,比如阿拉伯语Arabic,这些语言显示与其他语言,比如英语、中文、日文,韩文,在显示上有很大区别,它们都是基本都是从右向左显示,正好与常见的文字显示方式相反,另外如果在这些小语种语言里再夹杂一些数字,英文或符号,却又是从左向右显示,也就是说,这些语言显示是双向的,一开始以为全世界文字显示都是一个方向LTR,看到这些国家的语言后,才知道原来还有一种与我们通常认为的正好相反的显示方式。
为了处理这样的文字,有一套专门的算法,叫[UBA](http://www.unicode.org/reports/tr9/)(unicode bidirectional algorithm),有兴趣可以阅读这个算法。另外,针对这样的算法,还有一个专门的工具叫[fribidi](https://www.fribidi.org/),它是开源的,这个工具定义了一些函数接口,使用这些函数,就可以很方便的处理像Arabic这样从右向左RTL双向显示的文字。下面主要介绍下在i586环境和ARM环境下的编译与使用:
###i586环境
在ubuntu14.04 32bits机器上编译,一般ubuntu环境默认会支持gcc编译,以及包含Glib库,所以这里没有什么前提条件,下载解压后,按步骤操作就可以编译成功执行。
####下载
目前版本是fribidi-0.19.7.tar.bz2
####配置编译
jack@jxes-VirtualBox:~/samba_share/fnt$ tar xjf fribidi-0.19.7.tar.bz2
jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7$ ./configure --prefix=/home/jack/a //prefix指定安装目录,如果不指定,默认是安装到系统user/bin,或user/local/bin下的
jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7$ make
编译成功后:
jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7$ ls
aclocal.m4 ChangeLog config.h configure fribidi.pc lib Makefile.am stamp-h1
ar-lib ChangeLog.old config.h.in configure.ac fribidi.pc.in libtool Makefile.in test
AUTHORS charset config.log COPYING gen.tab ltmain.sh missing test-driver
bin compile config.status depcomp INSTALL m4 NEWS THANKS
bootstrap config.guess config.sub doc install-sh Makefile README TODO
//产生可执行文件fribidi
jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7$ ls bin
fribidi fribidi-bidi-types fribidi-caprtl2utf8.c fribidi-main.c.bak getopt.c gettext.h SAMPLE.txt
fribidi-benchmark fribidi-bidi-types.c fribidi-caprtl2utf8.o fribidi-main.o getopt.h Makefile ts.txt
fribidi-benchmark.c fribidi-bidi-types.o fribidi-main-bak.c getopt1.c getopt_int.h Makefile.am ts_un.txt
fribidi-benchmark.o fribidi-caprtl2utf8 fribidi-main.c getopt1.o getopt.o Makefile.in
//产生so库
jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7$ ls lib/.libs/
fribidi-arabic.o fribidi-deprecated.o fribidi-mem.o fribidi-run.o libfribidi.la libfribidi.so.0
fribidi-bidi.o fribidi-joining.o fribidi-mirroring.o fribidi-shape.o libfribidi.lai libfribidi.so.0.3.6
fribidi-bidi-types.o fribidi-joining-types.o fribidi.o libfribidi.exp libfribidi.so libfribidi.ver
jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7$
####测试
测试结果中的Gx:是添加的debug信息,可以忽略,一种是从文件中显示,一种是直接在控制台上显示,从控制的显示,我们发现Arabic的RTL的显示方式。
jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7$ cd bin
jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7/bin$ ./fribidi SAMPLE.txt
G:fribidi
G2:GGGGGGGG
؟ﺪﻛﺄﺘﻣﺖﻧﺃ ﻞﻫG15:
G2:GGGGGGGG
G15:
G2:GGGGGGGG
ﺪﻛﺄﺘﻣﺖﻧﺃ ﻞﻫG15:
G2:GGGGGGGG
G15:
G2:GGGGGGGG
ءﺍﺮﺷ ﺔﻴﻠﻤﻋG15:
G2:GGGGGGGG
G15:
G2:GGGGGGGG
ﺔﻴﻠﻤﻌﻟﺍ ﻉﻮﻧ ﺮﺘﺧﺍG15:
G2:GGGGGGGG
G15:
G2:GGGGGGGG
ءﺍﺮﺸﻟﺍ ﻎﻠﺒﻣG15:
G2:GGGGGGGG
G15:
G2:GGGGGGGG
ﻯﺪﻣ ﻢﻜﻣﺍﺪﺨﺘﺳﻻ ﺍﺮﻜﺷG15:
G2:GGGGGGGG
G5: G15:jack@jxes-VirtualBox:~/samba_share/fnt/fribidi-0.19.7/bin$ ./fribidi
G:fribidi
؟ﺪﻛﺄﺘﻣﺖﻧﺃ ﻞﻫG
G2:GGGGGGGG
G4: Gﻫﻞ ﺃﻧﺖﻣﺘﺄﻛﺪ؟G15:
###ARM环境
####下载
fribidi-0.19.7.tar.bz2
####配置编译
编译过程与i586环境下基本一样,只是这里指定了交叉工具链host=arm-linux,需要注意的是交叉工具链要在系统环境变量里事先指定好。
jack@jxes-VirtualBox:~/samba_share/fnt/am/fribidi-0.19.7$ echo $PATH
/home/jack/bin:/home/jack/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/home/jack/go/bin:/home/jack/tools/cortexA9/bin
jack@jxes-VirtualBox:~/samba_share/fnt/am/fribidi-0.19.7$ ./configure --prefix=/home/jack/b --host=arm-linux
jack@jxes-VirtualBox:~/samba_share/fnt/am/fribidi-0.19.7$ make
jack@jxes-VirtualBox:~/samba_share/fnt/am/fribidi-0.19.7$ ls
aclocal.m4 ChangeLog config.h configure fribidi.pc lib Makefile.am stamp-h1
ar-lib ChangeLog.old config.h.in configure.ac fribidi.pc.in libtool Makefile.in test
AUTHORS charset config.log COPYING gen.tab ltmain.sh missing test-driver
bin compile config.status depcomp INSTALL m4 NEWS THANKS
bootstrap config.guess config.sub doc install-sh Makefile README TODO
jack@jxes-VirtualBox:~/samba_share/fnt/am/fribidi-0.19.7$ ls lib/.libs/
fribidi-arabic.o fribidi-deprecated.o fribidi-mem.o fribidi-run.o libfribidi.la libfribidi.so.0
fribidi-bidi.o fribidi-joining.o fribidi-mirroring.o fribidi-shape.o libfribidi.lai libfribidi.so.0.3.6
fribidi-bidi-types.o fribidi-joining-types.o fribidi.o libfribidi.exp libfribidi.so libfribidi.ver
jack@jxes-VirtualBox:~/samba_share/fnt/am/fribidi-0.19.7$
jack@jxes-VirtualBox:~/samba_share/fnt/am/fribidi-0.19.7$ ls bin
fribidi fribidi-bidi-types fribidi-caprtl2utf8.c getopt1.c getopt_int.h Makefile.am
fribidi-benchmark fribidi-bidi-types.c fribidi-caprtl2utf8.o getopt1.o getopt.o Makefile.in
fribidi-benchmark.c fribidi-bidi-types.o fribidi-main.c getopt.c gettext.h
fribidi-benchmark.o fribidi-caprtl2utf8 fribidi-main.o getopt.h Makefile
jack@jxes-VirtualBox:~/samba_share/fnt/am/fribidi-0.19.7$
本文详细介绍了如何在i586的Ubuntu 14.04 32位系统及ARM环境中编译Fribidi。在i586环境下,无需额外设置,直接下载、解压并编译即可。而在ARM环境下,需使用交叉工具链,并确保其已正确设置在系统路径中。
491

被折叠的 条评论
为什么被折叠?



