为什么同一个字符通过将其大小写更改为UPPER然后更低来进行两次比较?

Tus*_*nne 5 java string unicode comparator

以下代码在java中的Class String中.我不明白为什么两个不同字符串中的字符被比较两次.首先做大写,如果失败则做小写.

我的问题是,是否需要?如果是,为什么?

  public static final Comparator<String> CASE_INSENSITIVE_ORDER
                                             = new CaseInsensitiveComparator();
        private static class CaseInsensitiveComparator
                implements Comparator<String>, java.io.Serializable {
            // use serialVersionUID from JDK 1.2.2 for interoperability
            private static final long serialVersionUID = 8575799808933029326L;

            public int compare(String s1, String s2) {
                int n1 = s1.length();
                int n2 = s2.length();
                int min = Math.min(n1, n2);
                for (int i = 0; i < min; i++) {
                    char c1 = s1.charAt(i);
                    char c2 = s2.charAt(i);
                    if (c1 != c2) {
                        c1 = Character.toUpperCase(c1);
                        c2 = Character.toUpperCase(c2);
                        if (c1 != c2) {
                            c1 = Character.toLowerCase(c1);
                            c2 = Character.toLowerCase(c2);
                            if (c1 != c2) {
                                // No overflow because of numeric promotion
                                return c1 - c2;
                            }
                        }
                    }
                }
                return n1 - n2;
            }
        }
Run Code Online (Sandbox Code Playgroud)

Jan*_*Jan 12

问题可能更复杂.

存在字符,其中对于相同的大写代码点存在多个小写代码点,反之亦然.因此,要检查不区分大小写的匹配,如果其中一个匹配,则需要比较大写和小写版本.

一个例子是

希腊大写字母"Σ"有两种不同的小写形式:单词最终位置的"ς"和其他地方的"σ".

资料来源:维基百科

对于大写不等于但小写非常如此,VGR提供了这个极好的例子:

一个更好的例子是'\ u0130'(İ)和'我'.将它们传递给toUperCase会使它们保持不变(因此不同),但是将它们传递给toLowerCase会产生相同的字符值