BreakIterator 无法正确处理中文文本

BreakIterator not working correctly with Chinese text

我用BreakIterator.getWordInstance将中文文本拆分成单词。这是我的例子

import java.text.BreakIterator;
import java.util.Locale;

public class Sample {
    public static void main(String[] args) {
        String stringToExamine = "I like to eat apples. 我喜欢吃苹果。";

        //print each word in order
        BreakIterator boundary = BreakIterator.getWordInstance(new Locale("zh", "CN"));
        boundary.setText(stringToExamine);

        printEachForward(boundary, stringToExamine);
    }

    public static void printEachForward(BreakIterator boundary, String source) {
        int start = boundary.first();
        for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) {
            System.out.println(start + ": " + source.substring(start, end));
        }
    }
}

我的示例文本来自

我得到的输出是

0: I
1:  
2: like
6:  
7: to
9:  
10: eat
13:  
14: apples
20: .
21:  
22: 我喜欢吃苹果
28: 。

然而,预期输出是

0 I
1  
2 like
6  
7 to
9  
10 eat
13  
14 apples
20 .
21  
22 我
23 喜欢
25 吃
26 苹果
28 。

我什至尝试了纯中文文本,但单词在空格和标点符号上都被破坏了。

我正在为服务器编程,所以 jar 文件大小不是一个大问题。我正在尝试使用最少公共子序列(但在单词上)查找给定内容中与样本内容不同的单词数。

我做错了什么?

标准 BreakIterator 不支持在 CJK 表意文字的完整字符串中检测 "word" 边界。有一个关于这个主题的 bug report,但它在 2006 年作为 "Won't Fix".

关闭了

相反,您需要使用 ICU implementation. If you're developing on Android, you already have this as android.icu.text.BreakIterator. Otherwise, you'll need to download the ICU4J library from http://site.icu-project.org/download,其形式为 com.ibm.icu.text.BreakIterator