2009-08-26 69 views
14

我在这里的第一个问题:-)
尽我所能阅读的规则和搜索,如果这个问题已经问过。Java的equalsIgnoreCase失败,SS(“夏普S”德语字母使用)

以下代码

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; SS = SS) 而且1个假(SS = SS!)。 尝试使用toLowerCase(区域设置),但它没有帮助。

这是一个已知的问题?

+1

迈克尔卡普兰已经写了关于德国夏普S字符的广泛。最近事情发生了变化,我希望图书馆能够发挥一些追赶的作用。很多好的信息在这里:http://blogs.msdn.com/michkap/archive/2008/05/15/8506679.aspx – 2009-08-26 11:31:11

回答

10

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

之所以str.toLowerCase()不返回一样str.toUpperCase().toLowerCase()是Java替代ßSS,但也没办法回去,所以SS成为ss和比较失败。

因此,如果您需要将案例分级,则必须使用str.toLowerCase()。如果没有,那么只需调用equalsIgnoreCase()而不进行任何上/下转换也应该起作用。

+1

即使Java 7支持新的Unicode字符,“ß”.toUpperCase()仍然必须返回“SS”,因为大写“ß”仅仅是印刷的兴趣,并没有真正用在野外:http://en.wikipedia。org/wiki /Capital_ß – 2009-08-26 11:39:01

+0

在我的情况下,我试图将一些用户的字符串与预定义的字符串匹配(也许我应该在原始问题中提及它) 因此,我在此给​​出的代码仅仅是测试我执行了解为什么我的原始代码没有按预期工作。 很显然,equalsIgnoreCase方法的存在是为了让我们不必改变任何字符串的大小写。 无论如何,“练级”的概念是什么使这个我接受的答案:-) – targumon 2009-08-26 12:38:36

0

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

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

如果你有你能选择的话,myDictionary.get("glaßes")应该返回之前的东西Bifocals。那是合法的吗?

+2

“ß”和“ss”是不等价的。当字母不可用时,“ss”有时用于写“ß”。既然没有大写的“ß”(好吧,有一个,但它主要是印刷的好奇心,而不是一个现实中使用的字母),它总是会写在所有大写的“SS”中。反之亦然:“SS”.toLower()绝对是“ss”。 – 2009-08-26 11:37:38

+0

啊,呃。感谢澄清,Joachim。 – 2009-08-26 11:44:11

2

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

(顺便说一句,你可能想看看normalization,或者你最终会奇怪,为什么“é” 等于( “é”)可以返回false 。原因:一个是combining sequence

+0

很是怪异,我认为String类有2种方法分别用于toLowerCase和toUpperCase (一个不带参数+一个接受一个Locale) 但每次只有1个方法equalsIgnoreCase及与compareToIgnoreCase 如果Sun的人认为* case方法应该是Locale敏感的,那么我希望他们都能接受它。 感谢规范化链接,这对我的情况是一种矫枉过正,但都是一样的洞察力。 – targumon 2009-08-26 12:22:52

+0

@targumon:请注意,在* all * locales中'“ß”.toUpperCase(locale)'返回'“SS”',但equalsIgnoreCase并不在意。不知怎的,这一切都被打破了。 – maaartinus 2013-09-13 18:27:29

2

的Unicode没有定义的S-尖锐 大写形式,这是确切的点 - 在德国语言没有一个尖锐-S的可能性(。 ß)是任何单词的首字母或首字母。因此它只是无意义地争论大写ß...