Java国际化:BreakIterator

2023-05-16

【译自:http://tutorials.jenkov.com/java-internationalization/breakiterator.html , 不准确别怪我】

java.text.BreakIterator 类用来查找不同语言中的字符、单词和句子的边界。因为不同的语言有不同的字、单词和句子的边界,所以只是查找空格、逗号、句号、分号和冒号是不够的。你需要一个万无一失的、可用于各种语言的查找方法。BreakIterator 类就是干这个的。

创建一个 BreakIterator

一个 BreakIterator 实例只能判断以下四种边界之一:

  • 字符边界
  • 单词边界
  • 句子边界
  • 行边界

首先需要使用BreakIterator类提供的用于识别以上边界的,对应的工厂方法来创建一个实例。这些工厂方法有:

BreakIterator.getCharacterInstance();
BreakIterator.getWordInstance();
BreakIterator.getSentenceInstance();
BreakIterator.getLineInstance();

每个方法都需要一个 Locale 作为参数,然后返回一个 BreakIterator 实例,例如:

Locale locale = LocaleUK;

BreakIterator breakIterator =
    BreakIterator.characterInstance(locale);

字符边界

当查找一个字符边界时,需要区分用户字符和Unicode字符。

一个用户字符是指用户用笔书写时或者用户通常在屏幕上看到了字符。

一个用户字符通常需要一个或多个Unicode字符去表示;有的需要2个或更多的Unicode字符来表示。

一个 BreakIterator 的字符实例可以用于查找用户字符的边界,而不是Unicode字符。

例如,以下例子用来查找一个字符串的字符边界:

Locale locale = Locale.UK;
BreakIterator breakIterator =
        BreakIterator.getCharacterInstance(locale);

breakIterator.setText("Mary had a little Android device.");

int boundaryIndex = breakIterator.first();
while(boundaryIndex != BreakIterator.DONE) {
    System.out.println(boundaryIndex) ;
    boundaryIndex = breakIterator.next();
}

上例创建了一个用于英式英语的 BreakIterator 实例,然后调用setText() 方法指定用于查找的文本内容。

first() 方法返回找到的第一个断点,方法 next() 用于查找所有接下来的断点。这两个方法都返回查找到的用户字符中的Unicode字符索引。因此,如果一个用户字符占用了多于一个的Unicode字符,那么字符的索引会增加占用的Unicode字符数。

单词边界

当查找单词时,需要创建一个符合单词边界的、针对特定语言的BreakIterator 实例,下面是一个示例:

Locale locale = Locale.UK;
BreakIterator breakIterator =
        BreakIterator.getWordInstance(locale);
以上代码创建一个用于查找英国英语中单词边界的  BreakIterator 实例。

下面的例子演示了怎么查找一段英语文本的单词边界:

Locale locale = Locale.UK;
BreakIterator breakIterator =
        BreakIterator.getWordInstance(locale);

breakIterator.setText("Mary had a little Android device.");

int boundaryIndex = breakIterator.first();
while(boundaryIndex != BreakIterator.DONE) {
    System.out.println(boundaryIndex) ;
    boundaryIndex = breakIterator.next();
}

同样的,first() 和 next() 方法返回查找到单词的Unicode字符的索引。

用Java统计特定语言中的单词数Counting Words in a Specific Language in Java

这个Java代码片段显示了如果统计某个特定语言中的单词数:

public class WordCounter {

    public static class  WordCount {
        protected String word  = null;
        protected int    count = 0;
    }

    public static Map<String, WordCount> countWords(String text, Locale locale) {
        Map<String, WordCount> wordCounts = new HashMap<String, WordCount>();

        BreakIterator breakIterator = BreakIterator.getWordInstance(locale) ;
        breakIterator.setText(text);

        int wordBoundaryIndex = breakIterator.first();
        int prevIndex         = 0;
        while(wordBoundaryIndex != BreakIterator.DONE){
            String word = text.substring(prevIndex, wordBoundaryIndex).toLowerCase();
            if(isWord(word)) {
                WordCount wordCount = wordCounts.get(word);
                if(wordCount == null) {
                    wordCount = new WordCount();
                    wordCount.word = word;
                }
                wordCount.count++;
                wordCounts.put(word, wordCount);
            }
            prevIndex = wordBoundaryIndex;
            wordBoundaryIndex = breakIterator.next();
        }

        return wordCounts;
    }

    private static boolean isWord(String word) {
        if(word.length() == 1){
            return Character.isLetterOrDigit(word.charAt(0));
        }
        return !"".equals(word.trim());
    }
}

方法countWords() 需要一个 string 参数和一个 Locale 参数。Locale 代码了传入的string的语言类别。因此,当创建 BreakIterator,它可以创建针对那个语言类型的实例。

这个方法统计了一个单词在传入的串中有多少个,然后返回一个 Map<String, WordCount> 对象,Map中的key是一个一个单词,以小写形式表示,值是一个 WordCount 实例,它包含了两个变量:word 和 count 。只需要把所有的单词发生的次数相加就可以得到总的单词数了。

注意:isWord() 方法中是怎么使用 Character.isLetterOrDigit() 方法来判断某个字符是字母还是数字的,或者是其他的(例如分号,引号等)。Character.isLetterOrDigit()方法检查对应的unicode characters 是字母还是数字,并且不仅仅用在英语上,也可以用于其他语言。关于这个方法和其他的一些类似的方法的更详细的描述,可以参考:Characeter Methods 。

句子边界

对于特定语言的句子边界,需要创建一个BreakIterator 针对那种语言的句子边界实例:

Locale locale = Locale.UK;
BreakIterator breakIterator =
        BreakIterator.getSentenceInstance(locale);
以上代码创建了一个针对英国英语的  BreakIterator 句子实例。

以下示例查找英语文本中的句子边界:

Locale locale = Locale.UK;
BreakIterator breakIterator =
        BreakIterator.getSentenceInstance(locale);

breakIterator.setText(
        "Mary had a little Android device. " +
        "It had small batteries too.");

int boundaryIndex = breakIterator.first();
while(boundaryIndex != BreakIterator.DONE) {
    System.out.println(boundaryIndex) ;
    boundaryIndex = breakIterator.next();
}

行边界

也可以查找某段文本中的新行而不中断文本的阅读。这个时候需要一个拥有用于侦探潜在的行边界的BreakIterator 实例。注意:这并不能找到直接的行断点,而是潜在的行断点。找到潜在的行中断是需要把文本划分成多行显示的时候相当有用,即使这段文本不包括任何显示的分行。以下是一个创建这个的 BreakIterator 实例的例子:

Locale locale = Locale.UK;
BreakIterator breakIterator =
        BreakIterator.getLineInstance(locale);

这个例子创建一个拥有英式英语的潜在的行分割通用的 BreakIterator 实例。

下面的例子用于查找潜在的行分割:

Locale locale = Locale.UK;
BreakIterator breakIterator =
        BreakIterator.getLineInstance(locale);

breakIterator.setText(
        "Mary had a little Android device.\n " +
        "It had small batteries too.");

int boundaryIndex = breakIterator.first();
while(boundaryIndex != BreakIterator.DONE) {
    System.out.println(boundaryIndex) ;
    boundaryIndex = breakIterator.next();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java国际化:BreakIterator 的相关文章

随机推荐

  • An overview of time series forecasting models

    An overview of time series forecasting models 2019 10 04 09 47 05 This blog is from https towardsdatascience com an over
  • swap与zRam能否提升游戏性能【转】

    http bbs angeeks com thread 2384563 1 1 html 先来谈谈swap xff0c swap是创建在sdcard上的一个缓存文件或者也可以创建在手机NAND上的 xff0c 其两者的速度不 说 xff0c
  • 如何在linux脚本里面套娃运行脚本

    直接在脚本里面写sudo bash xx sh 有时候可能会出现问题 xff0c 这个时候就可以使用gnome重新打开新终端运行 首先安装gnome的库 sudo apt get install gnome terminal 然后在脚本里面
  • 树莓派如何设置开机自启动脚本

    参考文章 xff1a 史鑫龙 xff1a 树莓派开机自动执行程序 通过桌面启动 by xinlong 通过该文章的操作可以实现开机启动python程序 xff0c 但并不能实现开机运行shell脚本 xff0c 结合我之前的文章发现配合gn
  • Markdown学习记录

    Markdown 1 代码块 xff1a 代码块语法 xff1a 96 96 96 python 96 96 96 shell 1 python代码 print 34 Hello World 34 2 shell脚本 linux下重启的命令
  • MAC终端代理设置

    移动开发有时需要设置代理 xff0c 不然太慢 在终端中输代码即可显示隐藏文件 defaults write com apple finder AppleShowAllFiles boolean true killall Finder 再次
  • C#:如何查看.net core版本?

    C xff1a 如何查看 net core版本 xff1f 打开控制面板 xff0c 选择 程序和功能 xff0c 找到下图选项 xff0c 即可查看 net core版本 检查是否已正确安装所有内容 xff1a 安装完成后 xff0c 打
  • Qt信号槽如何传递参数

    Qt信号槽如何传递参数 利用 Qt 进行程序开发时 xff0c 有时需要信号 槽来完成参数传递 带参数的信号 槽在使用时 xff0c 有几点需要注意的地方 xff0c 下面结合实例进行介绍 1 当信号与槽函数的参数数量相同时 xff0c 它
  • 解决 zsh: command not found 报错

    问题描述 最近在开发 Go 项目 xff0c 使用 go get u xxxx 成功下载安装包后 xff0c 在终端执行新下载包的命令 xff0c 一直报 zsh command not found 的错误 一开始以为是包没安装成功 xff
  • Ubuntu 安装scipy错误解决办法

    在ubuntu 14 04使用pip3 install scipy时报错 xff1a numpy distutils system info NotFoundError no lapack blas resources found 百度了一
  • LA5016-IIC EEPROM协议解析

    写入 LA5016 解析协议设置 xff1a 波形 读取 波形 xff1a
  • Linux下安装oracle数据库提示DISPLAY not set. Please set the DISPLAY and try again.解决方法

    问题描述 xff1a Linux下安装oracle数据库提示DISPLAY not set Please set the DISPLAY and try again 如下图所示 xff1a 解决办法 xff1a 切换到root 用户 xff
  • html 清除缓存样式

    autocomplete 61 off
  • ArcGIS Server for linux 服务无法启动解决简记

    今天在一台Linux虚拟机上安装了一个ArcGIS Server For Linux 只ArcSOC 组件 xff0c 一切正常 xff0c 但是启动服务的时候报一下的错误 xff1a root 64 rhsde scripts start
  • Java中swap()方法的实现

    为了能更多的掌握C C 43 43 xff0c 时不时的就会拿起一本什么书看看 昨天又看到了请指针和引用的部分 xff0c 又会有经典的swap 方法的实现 几乎所有人都知道了 xff0c 要实现一个正确的swap 方法需要以指针或引用为参
  • 渐变色原理

    引用 http www islandcn com post 311 html 在图象图形的编程中 经常会见到渐变色以及各种图片的叠加等效果 这篇文章就是要对这些效果的原理加以分析 并在Elastos 操作系统 Mobile Edition
  • JAX-WS 学习二:创建客户端

    上一节中介绍了怎么基于JAX WS的API创建服务端 xff0c 这一节介绍一下创建一个客户端调用WebService服务 要创建一个Client端也相当简单 xff0c 不过需要知道几个东西 xff1a 1 wsdl文件路径 需要读取服务
  • 使用JDI监听Java程序运行

    Java虚拟机提供了一套用于调试 xff08 JVMDI xff09 和监视 xff08 JVMPI xff09 的接口 xff0c Java5之后统一为JVMTI xff1a http docs oracle com javase 1 5
  • 使用CXF和camel-cxf调用webservice

    CXF是什么 Apache CXF 是一个开源的 全功能的WebService框架 xff0c 它提供了一套工具和API来帮助开发和构建WebService xff0c 像 JAX WS 和 JAX RS 它也支持许多WebService标
  • Java国际化:BreakIterator

    译自 xff1a http tutorials jenkov com java internationalization breakiterator html xff0c 不准确别怪我 java text BreakIterator 类用来