Nis*_*lon 5 java unicode case-insensitive
我正在使用Java 8.
我已经苦苦挣扎了几天才能理解与字符串比较相关的错误.看看这个测试.两个字符串是不同的("i"不是同一个,而不是另一个的大写/小写版本).
我希望这个测试能够通过.第一个断言成功但第二个断言失败(由于某种原因,compareIgnoreCase返回0)
知道发生了什么事吗?
谢谢
String str1 = "v?rus";
String str2 = "virus";
Assert.assertNotEquals(0, str1.compareTo(str2));
Assert.assertNotEquals(0, str1.compareToIgnoreCase(str2));
Run Code Online (Sandbox Code Playgroud)
Javadoc compareToIgnoreCase说:
按字典顺序比较两个字符串,忽略大小写差异.此方法返回一个整数,其符号是
compareTo使用字符串的规范化版本进行调用,其中通过调用Character.toLowerCase(Character.toUpperCase(character))每个字符消除了大小写差异.
该?字符没有相应的大写字母,因此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)?- "上面有点的拉丁文大写字母"(U + 0130)上限/标题/小写转换由Unicode定义,可以在上面的链接中看到.大写I甚至有评论:
土耳其语和阿塞拜疆语使用U + 0131作为小写
小写i有评论:
土耳其语和阿塞拜疆语使用U + 0130作为大写字母
正如shmosel的评论中提到的:
这是因为字符比较对语言环境不敏感.在土耳其语言环境的大写
iIS?和小写I的?.
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |