我正在使用Java 8。

我已经努力了几天,以了解与字符串比较有关的错误。
看看这个测试。这两个字符串是不同的(“i”不是相同的,也不是另一个的大写/小写形式)。

我希望这个测试能够通过。第一个断言确实成功,但是第二个断言失败(由于某些原因,compareIgnoreCase返回0)

知道发生了什么吗?

谢谢

String str1 = "vırus";
String str2 = "virus";
Assert.assertNotEquals(0, str1.compareTo(str2));
Assert.assertNotEquals(0, str1.compareToIgnoreCase(str2));

最佳答案

compareToIgnoreCase 的Javadoc说:


ı字符没有相应的大写字母,因此toUpperCase返回I,然后toLowerCase返回i

同样,İ字符没有相应的小写字母,因此toLowerCase返回i

这意味着compareToIgnoreCase认为这4个字母相同:

  • ı-'LATIN SMALL LETTER DOTLESS I' (U+0131)
  • i-'LATIN SMALL LETTER I' (U+0069)
  • I-'LATIN CAPITAL LETTER I' (U+0049)
  • İ-'LATIN CAPITAL LETTER I WITH DOT ABOVE' (U+0130)

  • 大写/标题/小写转换由Unicode定义,可以在上面的链接中看到。大写的I甚至有一个注释:



    小写的i具有注释:



    comment by shmosel中所述:

    关于java - String.compareIgnoreCase返回错误的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50518957/

    10-11 04:23