如何在Java中模拟音译?

时间:2014-07-31 13:21:03

标签: java unicode tr

在Perl中,我通常使用音译来计算字符串中与一组可能的字符匹配的字符数。比如:

$c1=($a =~ y[\x{0410}-\x{042F}\x{0430}-\x{044F}]
            [\x{0410}-\x{042F}\x{0430}-\x{044F}]);

将计算$ a中的西里尔字符数。和前面的例子一样,我有两个类(或两个范围,如果你愿意的话),我还有一些其他的类:

$c4=($a =~ y[\x{AC00}-\x{D7AF}\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{A960}-\x{A97F}\x{D7B0}-\x{D7FF}]
            [\x{AC00}-\x{D7AF}\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{A960}-\x{A97F}\x{D7B0}-\x{D7FF}]);

现在,我需要在Java中做类似的事情。 Java中是否有类似的结构?或者我需要迭代所有字符,并检查它是否在每个类的限制之间?

谢谢

3 个答案:

答案 0 :(得分:1)

在Java中没有看到类似tr///的内容。

你可以使用这样的东西来计算所有的比赛:

Pattern p = Pattern.compile("[\\x{0410}-\\x{042F}\\x{0430}-\\x{044F}]", 
                            Pattern.CANON_EQ);
Matcher m = p.matcher(string);
int count = 0;
while (m.find())
    count++;

答案 1 :(得分:1)

你可以试着玩这样的东西:

s.replaceAll( "[^\x{0410}-\x{042F}\x{0430}-\x{044F}]*([\x{0410}-\x{042F}\x{0430}-\x{044F}])?", "$1" ).length()

这个想法是从这里借来的:Simple way to count character occurrences in a string

答案 2 :(得分:1)

为了良好的顺序:使用Java Unicode支持。

int countCyrillic(String s) {
    int n = 0;
    for (int i = 0; i < s.length(); ) {
        int codePoint = s.codePointAt(i);
        i += Character.charCount(codePoint);
        if (UnicodeScript.of(codePoint) == UnicodeScript.CYRILLIC) {
            ++n;
        }
    }
    return n;
}

这使用完整的Unicode(其中两个16位字符可能代表Unicode&#34;代码点。&#34; 在Java中,Character.UnicodeScript类已经拥有了你需要的一切。

或者:

int n = s.replaceAll("\\P{CYRILLIC}", "").length();

此处\\P是西里尔集团\\p{CYRILLIC}的否定。