博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android中阿拉伯文研究
阅读量:6291 次
发布时间:2019-06-22

本文共 1373 字,大约阅读时间需要 4 分钟。

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

兩者最大的差異有:

  • 順序不同
    • 阿拉伯文的書寫(或顯示)順序是由右向左的
    • 阿拉伯文字元序列間如果有數字或英文等左邊開始書寫的文字,這些左向右寫的文字,呈現時不能跟著阿拉伯字一起字序倒轉
  • 單一字元最後顯示的形狀也不同
    • 字型檔處理上,會針對最後螢幕上呈現的字元給與另一套獨立的編碼
    • 這個獨立編碼,根據最新的 Unicode 標準,是不規範的,也就是由字型檔的創造者自行處理,可參考 
    • 不過為了相容,Unicode 還是保留一組編碼作為這個用途,例如阿拉伯語專用的 Arabic Presentation Forms-B ,可參考 
  • 可參看 

阿拉伯文字,從記憶體中原始 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 如下:

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

。建議直接參考  的 8.2 Arabic 這個章節,針對會遇到的部份,自己重寫比較直接。

如果要處理的文字只有阿拉伯語(不含其他阿拉伯語系的文字,例如波斯、埃及等),那只要處理 Arabic Block 中,也有在  列出的部份。對應的 glyphs 都可以在 Arabic Presentation Forms-B 找到。

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

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

     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230808
,如需转载请自行联系原作者
你可能感兴趣的文章
jquery-form 中文API
查看>>
谈谈NITE 2的第一个程序UserViewer
查看>>
/bin/bash^M: 坏的解释器: 没有那个文件或目录
查看>>
解决:Unable to execute dex: GC overhead limit exceeded
查看>>
Linux kali 3.14-kali1-amd64 编译安装 wine 1.7.33
查看>>
BZOJ3894 文理分科
查看>>
纯CSS3完成选项卡,不要js完成的选项卡
查看>>
vue做路由页面内容跳转
查看>>
sql学习之基础(MySql)
查看>>
mysql安装教程(转)+ 修改密码(转)
查看>>
CArchive与CFile一起的用法、、、
查看>>
OO的ALV隐藏工具栏的form
查看>>
mysql之日期函数
查看>>
【杂题】[LibreOJ 2541] 【PKUWC2018】猎人杀【生成函数】【概率与期望】
查看>>
- configuration.module has an unknown property 'loader' 问题解决
查看>>
七层网络模型
查看>>
Create C++ Class
查看>>
习题6-5 UVa1600 Patrol Robot(BFS)
查看>>
js获取网页高度
查看>>
java国际化(转)
查看>>