如何在4.2之前版本的Android上处理RTL语言?

时间:2013-04-01 15:16:22

标签: android android-webview textview hebrew right-to-left

背景

TextView始终存在RTL(从右到左)语言的问题。由于我只知道如何阅读希伯来语(除了英语),我将讨论它的问题:

  • 文字对齐(我不是在谈论引力)。作为一种RTL语言,希伯来语从右到左放置单词(与英语相反)。

    为了展示它是多么令人讨厌,想象一下,而不是展示“Hello world”。你通常得到“.Hello world”。如果你只用一个句子就可以很容易地修复它,但是当有多个标点符号时会更难。

  • 元音位置。希伯来语不需要元音来阅读文本,但有时没有它们就很难阅读(特别是圣经)。对于元音,希伯来语有所谓的“NIKUD”,它实际上就像字母内部的点。 Android中的问题是它们通常位于错误的位置。

    为了展示它是多么令人讨厌,想象一下,而不是展示“Hello world”。你通常得到“.eHlol owrld”。即使你试图修复它(把元音总是放在当前元素之后的一个字符),字母中的位置也不正确(想象“Hello”中的“e”就像“H”之上的那样,例子)。

仅在版本4.2(阅读here,在“原生RTL支持”下),Google已修复所有希伯来语相关问题(或至少看起来如此)。

问题

希伯来语的问题导致每个以色列航空公司和每个定制ROM制造商都有自己的解决方案来解决不同的问题,这使得在4.2之前的设备上处理RTL文本几乎是不可能的。

如果文本包含希伯来语和英文字母,事情就会变得更加令人沮丧。

我尝试了什么

我已经阅读了很多关于这些问题的网站,我尝试了很多解决方案,没有一个解决了所有设备上的问题:

问题

这个问题有明确的解决方案吗?

我认为最好的事情是因为Android 4.2解决了这个问题,并且Android是开源的,我们应该将其TextView导入到我们可以使用的库中,但谷歌还没有提供这样的库。

2 个答案:

答案 0 :(得分:13)

可悲的是,我认为没有一个好的解决方案(“好”意思是“完成工作并且随时可用”)。对于我们自己的支持希伯来语的Android应用程序,我们使用了多年来开发的自定义渲染机制。渲染机制可以完成所有工作:专有字体;双向(bidi)分析;字形放置;断线分析;文字流;尝试使用原生Android文本处理功能(特别是4.2之前版本)的一些问题是:

  1. 非常糟糕的字体。但是,您可以打包非常好的DejaVu等第三方字体。如果你需要的话,正确的字体可以通过nekudot和te'amim 1 的定位来创造奇迹。 (我同意你关于正确指点放置的重要性;阅读带有错位的nekudot的希伯来文本就像阅读一个充满CAPTCHAs的屏幕。)

  2. Buggy bidi分析。更糟糕的是,对于不同版本的Android,错误似乎有所不同。修改文本以包含策略性放置的bidi格式代码(RTL标记; LTR标记;等)可以克服许多这些错误(请参阅讨论here,这不是Android特有的)。但是,这样做很麻烦,而且由于Android版本之间的不一致,很难预先预测框架需要什么帮助。

  3. 没有(或经过深思熟虑)对从右到左问题的框架级意识。例如,祝福滚动条显示在希伯来语TextView的左侧。对于我们的应用程序,我们必须构建一个完整的滚动条系统,以便按照我们想要的方式工作。 (好认为Android是开源的!)

  4. 线路和分词不良分析。我们测试过的Android的至少一个早期版本认为每个nikud标记都是单词边界。当涉及到换行时,系统通常不知道如何处理像maqaf,gershayim或sof pasuk这样的希伯来语标点符号。

  5. 系统不会将一些较新的Unicode字符(如HOLAM HASER FOR VAV-U + 05BA-new to Unicode 5.0)识别为希伯来语脚本。

  6. 我的建议是,除非您准备自己构建一个从上到下的文本处理系统,否则您将放弃4.2之前版本的Android上的高质量文本显示,特别是如果您需要支持nekudot和te'amim。另外,计划使用我在前面两点中提到的技术。

    1 圣经的标记

答案 1 :(得分:2)

截至2013年8月,Android已发布可能适合您需求的Bi Directional Formatter的API文档。这包含在Android Support v4库中,我相信它应该在Android 4.2之前的版本中运行。

参考: http://developer.android.com/reference/android/support/v4/text/BidiFormatter.html