Java equalsIgnoreCase失败,ß(德语字母表中使用“Sharps”)

时间:2009-08-26 11:18:02

标签: java localization internationalization locale

我的第一个问题:-)
我最好阅读规则并搜索之前是否已经提出问题。

以下代码

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

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

这是一个已知问题吗?

4 个答案:

答案 0 :(得分:10)

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

str.toLowerCase()str.toUpperCase().toLowerCase()不同的原因是,Java将ß替换为SS,但无法返回,因此{{ 1}}变为SS,比较失败。

因此,如果您需要对案例进行调整,则必须使用ss。如果没有,那么简单地调用str.toLowerCase()而不进行任何上/下转换也应该有效。

答案 1 :(得分:2)

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

(顺便说一下,你可能想看看normalization,或者你最终会想知道为什么“é”.equals(“é”)可以返回false。 em>原因:一个是combining sequence 。)

答案 2 :(得分:2)

  

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

答案 3 :(得分:0)

嗯。我对德语一无所知,但我不确定我对Unicode字符被视为等同于某些罗马字母扩展的看法。你应该能够做到以下几点吗?

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

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