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

背景

TextView总是有RTL(从右到左)语言的问题。 由于我只知道如何阅读希伯来文(除了英文),所以我会谈论它的问题:

  • 文本alignment(我不是在说重力)。 作为一种RTL语言,希伯来语是从右向左(与英文相反)。

    为了展示它是多么令人讨厌,想象一下,不要展示“Hello world”。 你通常会得到“你好世界”。 如果只有一个句子,可以很容易地解决这个问题,但是如果有多个标点符号,这个问题就会变得更加困难。

  • 元音位置。 希伯来语不需要元音以阅读文本,但是有时在没有元音的情况下阅读是非常困难的(尤其是圣经)。 对于元音来说,希伯来文有所谓的“NIKUD”,实际上就像字母里的圆点。 在Android的问题是,他们通常位于错误的位置。

    为了展示它是多么令人讨厌,想象一下,不要展示“Hello world”。 你通常会得到“.eHlol owrld”。 即使你试图解决这个问题(把元音总是一个字符放在当前字符之后),这个字母中的位置是不正确的(假设“你好”中的“e”会像“H”例如)。

只有在4.2版本( 在这里阅读“Native RTL支持”),Google已经修复了所有希伯来语相关的问题(或者至less似乎是这样)。

问题

希伯来语的问题已经导致每个以色列航空公司和每个定制ROM制造商都有自己的解决scheme来解决不同的问题,这使得实际上不可能在4.2版本的设备上处理RTL文本。

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

我试过了

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

  • 有些人build议把字符'\ u200F'(或'\ u202D')放在文本的结尾/开始/结尾处。

  • 有人build议使用Html.fromHtml()方法,并在那里放些特别的东西。

  • 有人甚至build议使用WebView来代替(也可以使用WebSettings.setDefaultTextEncodingName() )。

这个问题

这个问题有没有确切的解决办法?

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

可悲的是,我不认为有一个好的解决scheme(“好”的意思是“这个工作,是现成的”)。 对于我们自己的支持希伯来语的Android应用程序,我们使用了我们多年开发的自定义渲染机制。 渲染机制完成一切:专有字体; 双向(双向)分析; 字形放置; 换行分析; 文本stream; 尝试使用原生Android文本处理function(尤其是4.2之前版本)的一些问题是:

  1. 真是蹩脚的字体。 不过,你可以打包像DejaVu这样很好的第三方字体。 如果你需要,正确的字体可以做nekudot和te'amim 1的定位奇迹。 (我同意你关于正确的指向位置的重要性;阅读希伯来语的文字与错位的nekudot,就像阅读屏幕上的完整的validation码。)

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

  3. 没有(或思考不足)的框架层意识到从右到左的问题。 例如,祝你的滚动条显示在希伯来语TextView的左侧。 对于我们的应用程序,我们必须构build一个完整的滚动条系统才能实现我们的目标。 (好的,认为Android是开源的!)

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

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

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

1圣经cantillation标记

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

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