为什么Java StringLatin1.regionMatchesCI方法在比较字符时先执行toUpperCase()然后执行toLowerCase()?

问题描述 投票:0回答:1

我正在研究

String.euqalsIgnoreCase
方法,发现最后它调用
StringLatin1.regionMatchesCI
方法。

但是,这个方法的代码我觉得很奇怪,这里是:

public static boolean regionMatchesCI(byte[] value, int toffset,
                                      byte[] other, int ooffset, int len) {
    int last = toffset + len;
    while (toffset < last) {
        char c1 = (char)(value[toffset++] & 0xff);
        char c2 = (char)(other[ooffset++] & 0xff);
        if (c1 == c2) {
            continue;
        }
        char u1 = Character.toUpperCase(c1);
        char u2 = Character.toUpperCase(c2);
        if (u1 == u2) {
            continue;
        }
        if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
            continue;
        }
        return false;
    }
    return true;
}

为什么先检查大写再检查小写?如果大写检查不匹配,小写字母不会总是失败吗?我是不是错过了什么?

java equals
1个回答
4
投票

在我发现(在谷歌上的某个地方)这个函数的源代码中,我有额外的解释:

        // try converting both characters to uppercase.
        // If the results match, then the comparison scan should
        // continue.
        char u1 = Character.toUpperCase(c1);
        char u2 = Character.toUpperCase(c2);
        if (u1 == u2) {
            continue;
        }
        // Unfortunately, conversion to uppercase does not work properly
        // for the Georgian alphabet, which has strange rules about case
        // conversion.  So we need to make one last check before
        // exiting.
        if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
            continue;
        }

所以看起来有一些解决方法。在 github 上,您可能会发现此函数的更多不同实现。

© www.soinside.com 2019 - 2024. All rights reserved.