【问题标题】:Why is the same character compared twice by changing its case to UPPER and then to lower?为什么同一个字符通过将其大小写更改为 UPPER 再更改为小写来比较两次?
【发布时间】:2016-04-09 09:25:21
【问题描述】:

下面的代码在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;
            }
        }

【问题讨论】:

    标签: java string unicode comparator


    【解决方案1】:

    问题可能更复杂。

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

    一个例子是

    希腊大写字母“Σ”有两种不同的小写形式:“ς”在词尾位置,“σ”在别处。

    来源:Wikipedia

    对于大写不相等但小写非常重要,VGR 提供了这个极好的示例:

    更好的例子是“\u0130”(©)和“I”。通过 toUpperCase 传递它们使它们保持不变(因此不同),但通过 toLowerCase 传递它们会产生相同的字符值

    【讨论】:

    • 你能举个例子吗?字符串和字符不处理字符集;字符集仅用于将这些编码为字节。
    • 来自维基百科:“希腊大写字母“Σ”有两种不同的小写形式:“ς”在词尾位置,“σ”在其他位置。“en.wikipedia.org/wiki/Letter_case
    • 但这与字符集有什么关系?
    • @Jan 也许你可以说“有些字母对于同一个大写字符有多个小写字符”或更准确地说“有些字母对于同一个大写代码点有多个小写代码点"
    • 更好的例子是'\u0130' (İ) 和'I'。通过 toUpperCase 传递它们使它们保持不变(因此不同),但通过 toLowerCase 传递它们会产生相同的字符值。
    猜你喜欢
    • 2019-07-20
    • 2014-04-20
    • 2021-03-30
    • 2023-04-05
    • 2012-01-03
    • 2011-04-25
    • 2011-10-06
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多