若想在minigui的开发中使用阿拉伯文和希伯来语,我们应该搞清楚以下几个问题:它们的显示和存储形式、为什么要显示和其他语言不同以及阿拉伯文的变形。
BiDi算法
在了解那么语言显示的情况,在我们所接触的很多国家语言都是右向左显示的即RTL(right to left),阿拉伯和希伯来确是左到右显示的即LTR(left to right),所谓bidi算法目前为双向显示,也就是一段文字中有RTL也有LTR的文字,这也是算法高明处, BiDi 算法可以确定每个字符的文字方向,从而将逻辑顺序转换成视觉顺序,或是用于与遗留系统交换数据进行存储布局转换。也让混合语言可以正确显示.如下所示
Bidi | 输入 |
开始 | שםשלהתקןenglish |
显示 | (翻转)english |
1.
希伯来语和英语 | 十六进制存储形式 |
שםשלהתקן | 0xd7 0x9e 0xd7 0xa1 0x20 0xd7 0xa2 0xd7 0xa1 0x20 ….. |
English | 0x45 0x6e 0x67 0x6c 0x69 0x73 0x68 |
联系:都是以二进制的形式存储
区别: ascill码一对一的形式存储如:E 对应0x45
而阿拉伯文和希伯来语一对二的形式如:ש对应0xd7 0xa1
1.2 阿拉伯文和希伯来语实现思路
阿拉伯文和希伯来语是以空格为标准将字符进行转换的,所以代码就用0x20来判断是不是空格,如下图:
conext 0xd7 0x9e 0xd7 0xa1 0x20 0xd7 0xa2 0xd7 0xa1
End start
第一步:str 开始为空
str 0xd7 0xa10xd7 0xa2
第二步
str 0xd7 0xa10xd7 0xa2 0x20
第三步
conext 0xd7 0x9e 0xd7 0xa1 0x20 0xd7 0xa2 0xd7 0xa1
end start
str 0xd7 0xa10xd7 0xa2 0x20 0xd7 0xa1 0xd7 0x9e 翻转后值
由于后面有ascill的问题,在混合的时候不仅判断空格也判断是不是小于0x7f,在ascill码表中这是表的最大值,为了区分,在字库中阿拉伯和希伯来语存储时大于ascill码的最大值得,所以代码中用不翻转的形式显示。
如下:
Conext : (Arabic) English
End start
第一步:str: English
第二步:
Conext : (Arabic) English
End start
str: English (Arabic翻转后)
标点符号也是常见的,阿拉伯文中符号和阿拉伯文是没有空格的这样代码又会有问题,特别是冒号,在我们看到的是尾部,在存储翻转时却在最开始,所以加了一个冒号时当空格来使,即在遇到标点符号的时候也让其将之前部分显示,标点符号直接输出。