Java:如何检查字符是否属于特定的unicode块?

我需要确定我的输入所属的自然语言。 目标是在混合输入中区分阿拉伯语英语单词,其中输入是Unicode并从XML文本节点中提取。 我注意到了类Character.UnicodeBlock 。 这与我的问题有关吗? 我怎样才能让它发挥作用?

编辑: Character.UnicodeBlock方法对阿拉伯语很有用,但显然不适用于英语(或其他欧洲语言),因为BASIC_LATIN Unicode块包含符号和不可打印的字符以及字母。 所以现在我使用String对象的matches()方法和正则表达式"[A-Za-z]+" 。 我可以忍受它,但也许有人可以建议更好/更快的方式。

是的,你可以简单地使用Character.UnicodeBlock.of(char)

如果[A-Za-z]+符合您的要求,您将找不到更快或更漂亮的东西。 但是,如果要匹配Latin1块中的所有字母(包括带重音的字母和连字),可以使用:

 Pattern p = Pattern.compile("[\\pL&&\\p{L1}]+"); 

这是所有Unicode字母集和所有Latin1字符集的交集。

Unicode Script属性可能更有用。 在Java中,可以使用java.lang.Character.UnicodeScript类查找它:

 Character.UnicodeScript script = Character.UnicodeScript.of(c); 

你对此问题有相反的问题,但具有讽刺意味的是,对他来说不起作用的东西应该对你有用。 只需用reg-exp“\ w”查找英文单词(只有ASCII兼容的字符)。

英文字符往往在这4个Unicode块中:

 ArrayList english = new ArrayList<>(); english.add(Character.UnicodeBlock.BASIC_LATIN); english.add(Character.UnicodeBlock.LATIN_1_SUPPLEMENT); english.add(Character.UnicodeBlock.LATIN_EXTENDED_A); english.add(Character.UnicodeBlock.GENERAL_PUNCTUATION); 

因此,如果您有一个String,您可以遍历所有字符并查看每个字符所在的Unicode块:

 for (char currentChar : myString.toCharArray()) { Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(currentChar); if (english.contains(unicodeBlock)) { // This character is English } } 

如果他们都是英国人,那么你知道你有所有英语的人物。 您可以为任何语言重复此操作; 你只需要弄清楚每种语言使用的Unicode块。

注意:这并不意味着您已经certificate该语言英语。 您只certificate它使用的是英文字符。 它可以是法语,德语,西class牙语或其他语言,其字符与英语有很多重叠。

还有其他方法可以检测实际的自然语言。 像langdetect这样的图书馆,我已经非常成功地使用,可以为你做到这一点:

https://code.google.com/p/language-detection/