我正在使用 C++ ICU 库。我希望将 utf-8 字符串分割成大致相等的块。但是,我希望在字素簇边界处划分块。我不希望将整个字符串转换为 utf-16 来实现内存和速度效率。相反,我想将少量接近我估计的块边界的 utf-8 代码点转换为 utf-16。然后我可以使用 ICU 的BreakIterator来计算出确切的边界。
组成字素簇的码点数量是否有硬性上限?如果是这样,那是什么?我需要知道这一点才能确定从 utf-8 转换为 utf-16 所需的最小代码点。
我正在Android中创建自己的文本处理器(一个自定义垂直脚本TextView for Mongolian).我想我必须自己找到所有的断线位置,以便我可以实现换行,但后来我发现了BreakIterator
.这似乎找到了各种语言中的字符,单词,行和句子之间的所有可能的中断.
我正在努力学习如何使用它.该文件是超过平均水平有帮助,但它仍然难以从只是阅读理解.我还找到了一些教程(见这里,这里和这里),但他们缺乏我正在寻找的输出的完整解释.
我正在添加这个Q&A风格的答案,以帮助自己学习如何使用BreakIterator
.
除了Java之外,我正在制作这个Android标签,因为它们之间显然存在一些差异.此外,Android现在支持ICUBreakIterator
,未来的答案可能会解决这个问题.
我使用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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的示例文本来自/sf/answers/2955363211/
我得到的输出是
0: …
Run Code Online (Sandbox Code Playgroud)