当文本位于TextView
。这是一个更通用的答案,既适用于基本/快乐场景,也适用于其他更复杂的用例。
在某些情况下,混合语言文本要在除内部之外的其他地方使用。TextView
。例如,文本可以在共享中传递Intent
到 Gmail 或 WhatsApp 等。在这种情况下,您必须使用以下类的组合:
- BidiFormatter https://developer.android.com/reference/android/support/v4/text/BidiFormatter.html
- TextDirectionHeuristics https://developer.android.com/reference/android/text/TextDirectionHeuristics.html
正如文档中所引用的,这些是...
用于格式化文本的实用程序类,以便在可能相反方向的上下文中显示而不会出现乱码。上下文的方向性在格式化程序创建时设置,文本的方向性可以估计或在已知时传入。
举例来说,假设您有一个String
包含英语和阿拉伯语的组合,并且您需要文本
-
右到左 (RTL).
- always 右对齐,即使句子以英语开头。
- 英语和阿拉伯语单词顺序正确且无乱码。
那么你可以使用以下方法来实现这一点unicodeWrap()
方法如下:
String mixedLanguageText = ... // mixed-language text
if(BidiFormatter.getInstance().isRtlContext()){
Locale rtlLocale = ... // RTL locale
mixedLanguageText = BidiFormatter.getInstance(rtlLocale).unicodeWrap(mixedLanguageText, TextDirectionHeuristics.ANYRTL_LTR);
}
如果字符串中存在一个 RTL 语言字符,这会将字符串转换为 RTL 并将其向左对齐,否则将回退到 LTR。如果你希望字符串是 RTL 的,即使它完全是英语(一种 LTR 语言),那么你可以使用TextDirectionHeuristics.RTL
代替TextDirectionHeuristics.ANYRTL_LTR
.
这是在没有方向的情况下处理混合方向文本的正确方法TextView
。有趣的是,正如文档所述,
另请注意,这些方向启发法对应于中提供的相同类型的常量View
类为setTextDirection()
, 例如TEXT_DIRECTION_RTL
.
Update:
我刚刚找到了Bidi http://docs.oracle.com/javase/7/docs/api/java/text/Bidi.htmlJava 中的 class 似乎做了类似的事情。查一下!
更多参考:
1. 编写阿拉伯语和英语混合的文本文件 https://stackoverflow.com/a/24723273.
2. Unicode 双向算法 http://www.unicode.org/reports/tr9/.