【问题标题】:BreakIterator behaving differently in Android API 29 and API 30BreakIterator 在 Android API 29 和 API 30 中的行为不同
【发布时间】:2021-05-31 09:45:38
【问题描述】:

我制作了以下函数将字符串分解为印地语字符。但它的行为不同 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;

}

我该如何解决这个问题?

【问题讨论】:

    标签: java android icu breakiterator


    【解决方案1】:

    我该如何解决这个问题?

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

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

    • 如果您认为是他们修复了 Android 30 中的行为导致您的应用在更高版本中“损坏”,那么您的解决方案是复制 Android 29 @987654321 @ 进入您的应用程序(使用不同的名称)并使用它。

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

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

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

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


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

    【讨论】:

    • 这并不像只复制一个名为 BreakIterator 的类那么简单。许多类都支持 BreakIterator。将 BreakIterator 的 ICU 实现与应用程序捆绑在一起将是一个更好的解决方案,尽管它会显着增加应用程序的大小,因此不推荐。
    • 它将
    【解决方案2】:

    BreakIterator 的 Android 实现无法准确解释 Bharatiya 脚本(abiguda 类型)。看到这个错误 - https://code.google.com/p/android/issues/detail?id=230832

    看起来它已针对 API 30 进行了修复,并且尚未向后移植到以前的版本。

    【讨论】:

    • 那么解决办法是什么?
    • @StephenC 除了等待 Android 11 在移动设备上广泛使用之外,没有其他可行的解决方案。最近我在字典应用中为xn--l1b6a9di5a0j.xn--h2brj9c 构建了一个单词搜索游戏,由于 BreakIterator 错误,我在有此错误的设备上禁用了游戏。
    • 除了我建议的可能的解决方案......当然:-)
    猜你喜欢
    • 2021-11-27
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多