本文共 1373 字,大约阅读时间需要 4 分钟。
阿拉伯語系在文字處理上是我目前所知道最複雜的。阿拉伯文一些獨有的特性,導致其文字儲存時的編碼或在記憶體的原始 Unicode characters 序列,跟最後螢幕上看到的有很大的差異。
兩者最大的差異有:
阿拉伯文字,從記憶體中原始 Unicode 順序(memory representation in logical order),到最後螢幕呈現的結果(glyphs arrangement in visual order),中間的整個處理流程叫作造形(shaping),一般是顯示時由 rendering engine 處理的。
Arabic Shaping 可以區分成下列五部分:
前三者要依序處理。字序重排及鏡像矯正可以最先處理或最後處理,但會因先後處理不同會影響到前三項處理的細節。完整的字序重排及鏡像矯正說明可以參閱 。
網路上可以找到的 source code 如下:
其中, Android 版是 CE 版的改寫,但這兩支程式都有個問題,就是沒考慮到 Combining Marks ,遇到 Transparent Joining Types 的字元時,就會出錯,這很容易遇到。第三支程式應該比較完整,但它太龐雜了,有耐心的話可以慢慢啃
。建議直接參考 的 8.2 Arabic 這個章節,針對會遇到的部份,自己重寫比較直接。如果要處理的文字只有阿拉伯語(不含其他阿拉伯語系的文字,例如波斯、埃及等),那只要處理 Arabic Block 中,也有在 列出的部份。對應的 glyphs 都可以在 Arabic Presentation Forms-B 找到。
要完整處理整個阿拉伯語系,那勢必得直接採用下列資料:
其他值得參考的資料如下: