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

时间:2009-01-01 08:43:01

标签: java regex unicode char

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

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

5 个答案:

答案 0 :(得分:18)

是的,您只需使用Character.UnicodeBlock.of(char)

即可

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

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

ArrayList<Character.UnicodeBlock> 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块。

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

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

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

答案 3 :(得分:1)

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

httpGet.setHeader("Authorization","VST "+token)

答案 4 :(得分:0)

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