Java 的 equalsIgnoreCase 以 ß 失败(德语字母表中使用的“Sharp S”)

我在这里的第一个问题:-)
尽我所能阅读规则并搜索问题是否已经问过。

下面的代码

    String[] strings = {"cAsE", "\u00df"};
    for (String str : strings) {
        System.out.println(str.equalsIgnoreCase(str.toLowerCase()));
        System.out.println(str.equalsIgnoreCase(str.toUpperCase()));
    }

输出 true 3 次 (cAsE = case; cAsE = CASE; ß = ß),但也输出 1 false (ß != SS)。尝试使用toLowerCase(Locale),但它没有帮助。

这是一个已知问题吗?


答案 1

直到最近,Unicode还没有定义大写版本的s-sharp。我不确定最新的Java 7版本是否已经包含了这个新字符,以及它是否正确处理它。我建议试一试。

返回的原因与Java相同,但没有办法返回,所以变得和比较失败。str.toLowerCase()str.toUpperCase().toLowerCase()ßSSSSss

因此,如果您需要调平大小写,则必须使用 .如果没有,那么只需调用没有任何上限/下部转换也应该有效。str.toLowerCase()equalsIgnoreCase()


答案 2

Aaron Digulla拥有它。此外,在没有区域设置数据的情况下转换字符串也没有意义。在英语中,i的大写字母是I,但在土耳其语中是İString.compareIgnoreCase 不考虑区域设置数据。

(顺便说一句,你可能想研究规范化,否则你最终会想知道为什么“é”.equals(“é”)可以返回false。原因:一个是组合序列


推荐