Java中跨区域设置的不区分大小写的比较

Java中跨区域设置的不区分大小写的比较,java,localization,linguistics,Java,Localization,Linguistics,考虑下面的Java代码,比较包含 比较失败,因为“ß”.toUpperCase()实际上等于“SS”,这导致在equalsIgnoreCase()中的检查失败。toUpperCase()的Javadocs确实明确提到了这个案例,但是我不明白为什么没有提到这个ẞ, ? 更一般地说,我们应该如何进行不区分大小写的比较,可能是跨不同地区的比较。我们是否应该总是使用toUpper()或equalsIgnoreCase(),但决不能同时使用两者 问题似乎在于equalsIgnoreCase()的实现包括以

考虑下面的Java代码,比较包含

比较失败,因为“ß”.toUpperCase()实际上等于“SS”,这导致在
equalsIgnoreCase()中的检查失败。
toUpperCase()
的Javadocs确实明确提到了这个案例,但是我不明白为什么没有提到这个ẞ, ?

更一般地说,我们应该如何进行不区分大小写的比较,可能是跨不同地区的比较。我们是否应该总是使用
toUpper()
equalsIgnoreCase()
,但决不能同时使用两者

问题似乎在于
equalsIgnoreCase()
的实现包括以下检查:
anotherString.value.length==value.length
,这似乎与for
toUpper()
不兼容,后者的状态是:

由于大小写映射并不总是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.