Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓&x27;s BreakIterator将换行符视为句子分隔符_Java_Android_Breakiterator - Fatal编程技术网

Java 安卓&x27;s BreakIterator将换行符视为句子分隔符

Java 安卓&x27;s BreakIterator将换行符视为句子分隔符,java,android,breakiterator,Java,Android,Breakiterator,我有一个unix文本文件,我想在我的Android应用程序中读取它,并将其拆分为几个句子。但是我注意到,BreakIterator将一些换行字符视为句子分隔符。 我使用以下代码读取文件并将其拆分为几个句子(仅输出第一句用于演示): 但是,如果我将Eclipse中的代码作为桌面应用程序编译并运行,那么文本将被正确分割。我不明白为什么它在Android应用程序上做不到同样的事情 我尝试将文本文件转换为dos格式,甚至尝试读取文件并保留原始换行符: Pattern pat = Pattern.

我有一个unix文本文件,我想在我的Android应用程序中读取它,并将其拆分为几个句子。但是我注意到,
BreakIterator
将一些换行字符视为句子分隔符。 我使用以下代码读取文件并将其拆分为几个句子(仅输出第一句用于演示):

但是,如果我将Eclipse中的代码作为桌面应用程序编译并运行,那么文本将被正确分割。我不明白为什么它在Android应用程序上做不到同样的事情

我尝试将文本文件转换为dos格式,甚至尝试读取文件并保留原始换行符:

    Pattern pat = Pattern.compile(".*\\R|.+\\z");
    StringBuilder stringBuilder = new StringBuilder();
    try (Scanner in = new Scanner(file, "UTF-8")) {
        String line;
        while ((line = in.findWithinHorizon(pat, 0)) != null) {
            stringBuilder.append(line);
        }
        text = stringBuilder.toString();
        sentenceIterator.setText(text);
        int end = sentenceIterator.next();
        System.out.println(end);
        System.out.println(text.substring(0, end));
    }
但是没有成功。有什么想法吗? 您可以在此处下载该文件的摘录(unix格式):

我刚刚注意到,不需要下载这个文件就可以复制它。只需创建一个句子中有换行符的字符串(例如,
“Hello,\nworld!”
),然后运行一个插入指令的测试。如果在常规测试中使用了
BreakIterator
,则它将正确拆分

我希望有两句话:

第1句:

前言

如果一位同事今天晚上对你说,我的配偶 在家里制作不寻常的饭菜

第二句:

你会加入吗

是的,它们看起来不太好,但至少你知道为什么会这样(句子分隔符是?。等等)。但如果代码在Android上运行,它甚至会从

前言

出于某种原因

我不确定这是否是一个bug,或者是否有解决方法。但在我看来,这使得Android版的
BreakIterator
作为句子拆分器毫无用处,因为书中的句子跨越多行是很正常的


在所有的实验中,我都使用了相同的
import java.text.BreakIterator

这不是一个真正的答案,但它可能会给你一些见解

这不是一个文件编码问题,我尝试了他的方式,并有同样的错误行为

BreakIterator sentenceIterator = BreakIterator.getSentenceInstance(Locale.US);
String text = "Foreword\nIf a colleague were to say to you, Spouse of me this night today manufactures the unusual meal in a home. You will join?";
sentenceIterator.setText(text);
Android不使用与您的计算机相同的Java版本

我注意到当我打印出sentenceIterator对象的类时

sentenceIterator.getClass()
使用IntelliJ和Android运行时,我有不同的课程:

java.text.RuleBasedBreakIterator 
使用IntelliJ运行:

sun.util.locale.provider.RuleBasedBreakIterator
在Android上运行:

java.text.RuleBasedBreakIterator 
sun.util.locale.provider.RuleBasedBreakIterator
具有您想要的行为


我不知道如何让Android使用好的基于规则的Breakerator类。我甚至不知道这是否可能。

你期待的是什么?只有
前言
行?还是第一句话?在Android上运行时会得到什么输出?在这两种情况下是否使用了相同的导入-java.text.BreakIterator?在这两种情况下都是
import java.text.BreakIterator
但它是一个抽象类,可能是由
BreakIterator返回的实现。getSentenceInstance(Locale.US)
(即
RuleBasedBreakerator
)在java JDK和android JDK上是不同的。但我同意这很奇怪,甚至可能是Android实现中的一个bug。如果我在插入指令的测试(在模拟器上运行的测试)中使用BreakIterator,则运行时类是java.text.IcuIteratorWrapper,并且拆分无法按预期工作。但是,如果我在正常测试中使用BreakIterator,则运行时类是sun.util.locale.provider.RuleBasedBreakIterator,并且拆分工作正常。否。我认为java.text.IcuIteratorWrapper是罪魁祸首。我已经开始实现自己的迭代器。这样做的另一个原因是,用户应该能够设置最大句子长度,因为如果太长,TextToSpeech将无法处理它。