【问题标题】:Java's equalsIgnoreCase fails with ß ("Sharp S" used in German alphabet)Java 的 equalsIgnoreCase 以 ß 失败(德语字母表中使用“Sharp S”)
【发布时间】:2010-11-22 23:17:08
【问题描述】:

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

以下代码

    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 个错误 (ß != SS)。 尝试使用 toLowerCase(Locale) 但没有帮助。

这是一个已知问题吗?

【问题讨论】:

标签: java localization internationalization locale


【解决方案1】:

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

str.toLowerCase()str.toUpperCase().toLowerCase() 不返回相同的原因是Java 将ß 替换为SS 但无法返回,所以SS 变为ss 和比较失败。

所以如果你需要对案件进行平整,你必须使用str.toLowerCase()。如果没有,那么只需调用equalsIgnoreCase() 而不进行任何上下转换也应该可以工作。

【讨论】:

  • 即使 Java 7 支持新的 Unicode 字符,“ß”.toUpperCase() 仍必须返回“SS”,因为大写的“ß”仅用于印刷,并未真正用于狂野:en.wikipedia.org/wiki/Capital_ß
  • 在我的情况下,我试图将一些用户的字符串与预定义的字符串进行匹配(也许我应该在原始问题中提到它......)所以我在这里给出的代码只是我进行了一项测试,以了解为什么我的原始代码没有按预期工作。显然,equalsIgnoreCase 方法的存在是为了避免我们更改任一字符串的大小写。无论如何,“练级”的概念是我接受的答案:-)
【解决方案2】:

Aaron Digulla has it。此外,在没有语言环境数据的情况下转换字符串也没有意义。在英语中,i 的大写是 I,但在土耳其语中是 İString.compareIgnoreCase 不考虑语言环境数据。

(顺便说一句,您可能想查看normalization,否则您最终会想知道为什么 "é".equals("é") 会返回 false。原因:一个是combining sequence。)

【讨论】:

  • 对我来说很奇怪,String 类对于 toLowerCase 和 toUpperCase 各有 2 个方法(一个没有参数 + 一个接受区域设置),但如果 Sun 的人,每个 equalsIgnoreCase 和 compareToIgnoreCase 只有一个方法认为 *case 方法应该是区域设置敏感的,那么我希望它们都接受它。感谢您提供规范化链接,这对我的案例来说有点过头了,但仍然很有见地。
  • @targumon:请注意,在 all 语言环境中,"ß".toUpperCase(locale) 返回 "SS",但 equalsIgnoreCase 并不关心。不知何故,一切都坏了。
【解决方案3】:

Unicode 没有定义 s-sharp 的大写版本 这就是确切的一点 - 在德语中,尖锐-s (ß) 不可能是任何单词的大写字母或首字母。因此,争论大写 ß 是无意义的......

【讨论】:

    【解决方案4】:

    嗯。我对德语一无所知,但我不确定我对 Unicode 字符被视为等同于某些罗马字母扩展的感觉如何。您应该能够执行以下操作吗?

    myDictionary.put("glasses", new Bifocals());
    myDictionary.get("glaßes");
    

    如果你有你的 druthers,myDictionary.get("glaßes") 应该返回之前的 Bifocals。这合法吗?

    【讨论】:

    • "ß" 和 "ss" 不等价。当该字母不可用时,“ss”有时用于写“ß”。由于没有大写的“ß”(好吧,有一个,但它主要是为了排版问题,而不是实际使用的字母),它将始终以全大写形式写为“SS”。反之则不然:“SS”.toLower() 肯定是“ss”。
    • 啊,明白了。感谢您的澄清,约阿希姆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2015-10-17
    • 2013-11-28
    相关资源
    最近更新 更多