【发布时间】:2023-03-24 03:30:02
【问题描述】:
考虑下面的Java代码比较一个包含German grapheme ß的小字符串
String a = "ß";
String b = a.toUpperCase();
assertTrue(a.equalsIgnoreCase(b));
比较失败,因为 "ß".toUpperCase() 实际上等于 "SS",这最终导致在 equalsIgnoreCase() 中的检查失败。 toUpperCase() 的 Javadocs 确实明确提到了这个案例,但是我不明白为什么这没有转到 ẞ, the capital variant of ß?
更一般地说,我们应该如何进行不区分大小写的比较,可能跨越不同的语言环境。我们是否应该始终使用toUpper() 或equalsIgnoreCase(),而不是两者都使用?
似乎问题在于equalsIgnoreCase()的实现包括以下检查:anotherString.value.length == value.length,这似乎与toUpper()的Javadocs不兼容,其中状态:
由于大小写映射并不总是 1:1 字符映射,因此生成的 字符串的长度可能与原始字符串不同。
【问题讨论】:
-
您需要使用
Collator而不是String的内置方法。 -
SS是大写,因为it's defined to be in Unicode。 -
@AndyTurner 这很奇怪,因为大写字符有一个 Unicode 代码点,它将这个字符定义为小写字符fileformat.info/info/unicode/char/1e9e/index.htm
-
@AndyTurner 这是否与2008年引入首都和1993年最初的事实有关?
标签: java localization linguistics