我正在使用Java 8.
我一直在努力了解与字符串比较相关的错误。 看看这个测试。两个字符串是不同的(“i”不是同一个,而不是另一个的大写/小写版本)。
我希望这个测试能够通过。第一个断言确实成功但第二个断言失败(由于某种原因,compareIgnoreCase返回0)
知道发生了什么事吗?
由于
String str1 = "vırus";
String str2 = "virus";
Assert.assertNotEquals(0, str1.compareTo(str2));
Assert.assertNotEquals(0, str1.compareToIgnoreCase(str2));
答案 0 :(得分:9)
node.js mysql的Javadoc说:
按字典顺序比较两个字符串,忽略大小写差异。此方法返回一个整数,其符号是调用
compareTo
的符号,其中字符串的规范化版本通过在每个字符上调用Character.toLowerCase(Character.toUpperCase(character))
来消除大小写差异。
ı
字符没有相应的大写字母,因此toUpperCase
会返回I
,然后toLowerCase
会返回i
。
同样,İ
字符没有相应的小写字母,因此toLowerCase
会返回i
。
这意味着compareToIgnoreCase
认为这4个字母是相同的:
ı
- compareToIgnoreCase
i
- 'LATIN SMALL LETTER DOTLESS I' (U+0131) I
- 'LATIN SMALL LETTER I' (U+0069) İ
- 'LATIN CAPITAL LETTER I' (U+0049) 上限/标题/小写转换由Unicode定义,可以在上面的链接中看到。大写I
甚至有评论:
土耳其语和阿塞拜疆语使用U + 0131表示小写
小写i
有评论:
土耳其语和阿塞拜疆语使用U + 0130作为大写
如'LATIN CAPITAL LETTER I WITH DOT ABOVE' (U+0130)中所述:
这是因为字符比较对语言环境不敏感。在土耳其语区域设置中,
i
的大写字母为İ
,I
的小写字母为ı
。