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这样的图书馆,我已经非常成功地使用,可以为你做到这一点: