Java字符串忽略大小写实现

6

我正在阅读java.lang.String equals ignore case实现,并试图弄清为什么在比较大写字母后还需要比较小写字母?是否存在一些语言,在这些语言中,大写字母可能不匹配,但小写字母可能匹配?

// Code from java.lang.String class 
  public boolean regionMatches(boolean paramBoolean, int paramInt1, String paramString, int paramInt2, int paramInt3) {
    char[] arrayOfChar1 = this.value;
    int i = paramInt1;
    char[] arrayOfChar2 = paramString.value;
    int j = paramInt2;
    if (paramInt2 < 0 || paramInt1 < 0 || paramInt1 > this.value.length - paramInt3 || paramInt2 > paramString.value.length - paramInt3)
      return false; 
    while (paramInt3-- > 0) {
      char c1 = arrayOfChar1[i++];
      char c2 = arrayOfChar2[j++];
      if (c1 == c2)
        continue; 
      if (paramBoolean) {
        char c3 = Character.toUpperCase(c1);
        char c4 = Character.toUpperCase(c2);
// Why is java comparing to Lower case here
        if (c3 == c4 || Character.toLowerCase(c3) == Character.toLowerCase(c4))
          continue; 
      } 
      return false;
    } 
    return true;
  }

不确定是否存在这样的语言 - 德语中 ß/ss 的规则和土耳其语中 i 的变化似乎不包含在内。但是,现在或将来可能会出现这种情况,因此我想 Java 的开发者只是希望确保他们的算法是正确的。 - Dawood ibn Kareem
1个回答

3

一些字符仅存在于小写形式,一些仅存在于大写形式。例如,在德国我们有一个小写的字符"ß",它没有对应的大写版本。

我认为在其他语言中也可能发生相反的情况。


在Java中,"ß"的 toUpperCase 是什么? - N3al
1
"ß" 没有大写形式,它根本不存在。这不是 Java 的问题,它影响所有编程语言。在 Java 中,"ß".toUpperCase() 返回 "SS"。其他编程语言可能会返回 "ß" 或什么都不返回。 - Stefan
ß的首都不是SS或SZ吗(至少有时候是这样)?请参见此处。另外,当我在Java中尝试System.out.println("ß".toUpperCase());时,它会产生SS - Nexevis
那么在这种情况下,假设有一个像“ß”一样没有大写字母的字符“x”,那么“ß”的大写字母不就等于“x”的大写字母吗?即使它们不同,就像 null == null 或 SS == SS 一样,这样的比较也是错误的吗? - N3al
我不确定我是否正确理解了你的问题。'ß'的大写是'SS',这并不完全错误,因为我们德国人在没有'ß'键的设备上会写'ss'而不是'ß'。当没有'ö'时,我们也会写'oe'。上面的代码会说"Faß"等于"Fass",但是String.compareToIgnoreCase()返回108(不匹配)。我无法说哪个更好。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接