0

我制作了以下函数将字符串分解为印地语字符。但它的行为与 android API 29 和 API 30 不同。在 Android 29 中,印地语单词 चक्की 被分解为 च क् की 但在 Android 30 中,它被正确分解为 च क्की。

public List<String> breakIntoHindiChar(String textAnswer) {
    List<String> ansCharList = new ArrayList<String>();
    Locale hindi = new Locale("hi", "IN");
    BreakIterator breaker = BreakIterator.getCharacterInstance(hindi);
    breaker.setText(textAnswer);
    int start = breaker.first();
    for (int end = breaker.next();
         end != BreakIterator.DONE;
         start = end, end = breaker.next()) {

        ansCharList.add(textAnswer.substring(start, end));

    }
    return ansCharList;

}

我怎么解决这个问题?

4

2 回答 2

1

我怎么解决这个问题?

正如您在问题中指出的那样,Android 29 中的行为不正确,而 Android 30 中的行为是正确的。

所以这取决于你认为问题是什么

  • 如果您认为是他们修复了 Android 30 中的行为在更高版本上“破坏”了您的应用程序,那么解决方案是将Android 29复制BreakIterator到您的应用程序中(使用不同的名称)并使用它.

  • 如果您认为他们没有修复 Android 29(及更早版本)中的行为,并且您希望您的应用在较旧的 Android 上正常运行,那么解决方案是将Android 30复制BreakIterator到您的应用中(使用不同的名称)并使用它。

请注意,您要做的是为 实现向前或向后兼容的行为BreakIterator,尽管不在标准类中。

(可能有更优雅的解决方案,但我没有自己的 Android 主存储库的本地副本来挖掘历史。)

注意:如果您不能用BreakIterator该类的替代版本替换所有应用程序的使用,那么(AFAIK)将无法使行为保持一致。您无法修补 Android 平台。请注意,虽然您可以在自己的代码中使用android.icu.text.BreakIterator而不是使用,但这并不能解决您的应用所依赖的其他代码的问题。android.text.BreakIterator


但是,如果您认为问题在于BreakIteratorAndroid 29 与 30 中的行为不同......没有解决方案。这是事实。是的......它的行为确实不同......甚至谷歌也无法让它在Android 30中表现不一样......现在。

于 2021-08-02T01:57:50.103 回答
1

Android implementation of BreakIterator was not able to interpret Bharatiya scripts (abiguda type) accurately. See this bug - https://code.google.com/p/android/issues/detail?id=230832

Looks like it has been fixed for API 30 and has not been backported for previous versions.

于 2021-08-01T22:41:40.277 回答