Java中跨区域设置的不区分大小写的比较
考虑下面的Java代码,比较包含 比较失败,因为“ß”.toUpperCase()实际上等于“SS”,这导致在Java中跨区域设置的不区分大小写的比较,java,localization,linguistics,Java,Localization,Linguistics,考虑下面的Java代码,比较包含 比较失败,因为“ß”.toUpperCase()实际上等于“SS”,这导致在equalsIgnoreCase()中的检查失败。toUpperCase()的Javadocs确实明确提到了这个案例,但是我不明白为什么没有提到这个ẞ, ? 更一般地说,我们应该如何进行不区分大小写的比较,可能是跨不同地区的比较。我们是否应该总是使用toUpper()或equalsIgnoreCase(),但决不能同时使用两者 问题似乎在于equalsIgnoreCase()的实现包括以
equalsIgnoreCase()中的检查失败。toUpperCase()
的Javadocs确实明确提到了这个案例,但是我不明白为什么没有提到这个ẞ, ?
更一般地说,我们应该如何进行不区分大小写的比较,可能是跨不同地区的比较。我们是否应该总是使用toUpper()
或equalsIgnoreCase()
,但决不能同时使用两者
问题似乎在于equalsIgnoreCase()
的实现包括以下检查:anotherString.value.length==value.length
,这似乎与fortoUpper()
不兼容,后者的状态是:
由于大小写映射并不总是1:1字符映射,因此
字符串的长度可能与原始字符串的长度不同
Java的类是为不同的地区敏感文本比较操作而设计的。由于“大写”的概念在不同地区有很大差异,Collator
使用了一种更细粒度的模型,称为比较强度。提供了四个级别,它们如何影响比较取决于区域设置
下面是一个将Collator
与德语区域设置一起使用的示例,用于对字母ß
进行不区分大小写的比较:
Collator germanCollator = Collator.getInstance(Locale.GERMAN);
int[] strengths = new int[] {Collator.PRIMARY, Collator.SECONDARY,
Collator.TERTIARY, Collator.IDENTICAL};
String a = "ß";
String b = "ß".toUpperCase();
for (int strength : strengths) {
germanCollator.setStrength(strength);
if (germanCollator.compare(a, b) == 0) {
System.out.println(String.format(
"%s and %s are equivalent when comparing differences with "
+ "strength %s using the GERMAN locale.",
a, b, String.valueOf(strength)));
}
}
代码打印出来
ß and SS are equivalent when comparing differences with strength 0 using the GERMAN locale.
ß and SS are equivalent when comparing differences with strength 1 using the GERMAN locale.
使用德国语言环境比较强度0的差异时,ß和SS是等效的。
ß和SS在使用德国语言环境比较强度1的差异时是等效的。
这意味着德国语言环境认为这两个字符串在主
和次
强度比较中相等。您需要使用a,而不是字符串
的内置方法。SS
是大写,因为。@AndyTurner这很奇怪,因为大写字符有一个Unicode编码点,它将这个字符定义为小写字符@AndyTurner,这仅仅是因为大写字母是在2008年引入的,而大写字母是在1993年引入的吗?
ß and SS are equivalent when comparing differences with strength 0 using the GERMAN locale.
ß and SS are equivalent when comparing differences with strength 1 using the GERMAN locale.