我需要确定输入所属的自然语言。
目标是在混合输入中区分阿拉伯语和英语单词,其中输入是Unicode并从XML文本节点中提取。
我注意到班级Character.UnicodeBlock
。它与我的问题有关吗?我怎样才能让它发挥作用?
修改
Character.UnicodeBlock
方法对阿拉伯语有用,但显然不适用于英语(或其他欧洲语言),因为BASIC_LATIN
Unicode块包含符号和不可打印字符以及字母。
所以现在我正在使用matches()
对象的String
方法而不是正则表达式"[A-Za-z]+"
。我可以忍受它,但也许有人可以建议更好/更快的方式。
答案 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这样的图书馆,我已经用得非常成功,可以为你做到这一点:
答案 3 :(得分:1)
Unicode Script property可能更有用。在Java中,可以使用java.lang.Character.UnicodeScript类查找它:
httpGet.setHeader("Authorization","VST "+token)
答案 4 :(得分:0)
你对this one有相反的问题,但具有讽刺意味的是,对他来说不起作用的东西应该对你有用。只需用reg-exp“\ w”查找英文单词(只有ASCII兼容的字符)。