天天看點

android中阿拉伯文研究

阿拉伯語系在文字處理上是我目前所知道最複雜的。阿拉伯文一些獨有的特性,導緻其文字儲存時的編碼或在記憶體的原始 Unicode characters 序列,跟最後螢幕上看到的有很大的差異。

兩者最大的差異有:

順序不同

阿拉伯文的書寫(或顯示)順序是由右向左的

阿拉伯文字元序列間如果有數字或英文等左邊開始書寫的文字,這些左向右寫的文字,呈現時不能跟著阿拉伯字一起字序倒轉

單一字元最後顯示的形狀也不同

字型檔處理上,會針對最後螢幕上呈現的字元給與另一套獨立的編碼

阿拉伯文字,從記憶體中原始 Unicode 順序(memory representation in logical order),到最後螢幕呈現的結果(glyphs arrangement in visual order),中間的整個處理流程叫作造形(shaping),一般是顯示時由 rendering engine 處理的。

Arabic Shaping 可以區分成下列五部分:

書寫連接(Arabic Cursive Joining)

阿拉伯文隻有書寫體(沒有印刷體或標準體),即使是印刷在紙上,或顯示在電腦上,都得考慮草寫連接問題

連接時,每個字元會因兩旁字元不同,而有不同形狀(glyphs),以應付不連,右連,左連,雙連等情況

形狀重塑(Arabic Ligatures)

除了連接需求外,一些連續的特定兩個字元,會結合(ligature)成另一種形狀(glyph)

記號標注(Combining Marks)

用來標注重音等等

字序重排(Reordering)

處理右到左的書寫,及混合左到右書寫的情形

鏡像矯正(Mirroring)

針對大於小於及括號等因左右方向不同而有不同意義的字元作修正

網路上可以找到的 source code 如下:

<a href="http://www.codeproject.com/Articles/3529/Arabic-Support-for-Windows-CE">Arabic Support for Windows CE</a>

<a href="http://stackoverflow.com/questions/7962704/how-to-support-arabic-text-in-android">How to support Arabic text in Android? - Stack Overflow</a>

<a href="http://code.google.com/searchframe#OAMlx_jo-ck/src/third_party/harfbuzz/src/harfbuzz-arabic.c">harfbuzz-arabic.c</a>

其中, Android 版是 CE 版的改寫,但這兩支程式都有個問題,就是沒考慮到 Combining Marks ,遇到 Transparent Joining Types 的字元時,就會出錯,這很容易遇到。第三支程式應該比較完整,但它太龐雜了,有耐心的話可以慢慢啃

要完整處理整個阿拉伯語系,那勢必得直接採用下列資料:

<a href="http://unicode.org/Public/UNIDATA/ArabicShaping.txt">ArabicShaping.txt</a>

<a href="http://unicode.org/Public/UNIDATA/extracted/DerivedJoiningGroup.txt">DerivedJoiningGroup.txt</a>

<a href="http://unicode.org/Public/UNIDATA/extracted/DerivedJoiningType.txt">DerivedJoiningType.txt</a>

其他值得參考的資料如下:

<a href="http://en.wikipedia.org/wiki/Template:Arabic_alphabet_shapes/joining">Template:Arabic alphabet shapes/joining</a>

<a href="http://www.w3.org/International/articles/inline-bidi-markup/">What you need to know about the bidi algorithm and inline markup</a>

<a href="http://www.i18nguy.com/markup/right-to-left.html">Right-To-Left Text in Markup Languages</a>

     本文轉自xyz_lmn51CTO部落格,原文連結:http://blog.51cto.com/xyzlmn/1230808,如需轉載請自行聯系原作者

繼續閱讀