diff --git a/src/main/java/org/apache/commons/text/TextStringBuilder.java b/src/main/java/org/apache/commons/text/TextStringBuilder.java index a3997bff87..64baa303a2 100644 --- a/src/main/java/org/apache/commons/text/TextStringBuilder.java +++ b/src/main/java/org/apache/commons/text/TextStringBuilder.java @@ -1908,8 +1908,12 @@ public boolean equalsIgnoreCase(final TextStringBuilder other) { for (int i = size - 1; i >= 0; i--) { final char c1 = thisBuf[i]; final char c2 = otherBuf[i]; - if (c1 != c2 && Character.toUpperCase(c1) != Character.toUpperCase(c2)) { - return false; + if (c1 != c2) { + final char u1 = Character.toUpperCase(c1); + final char u2 = Character.toUpperCase(c2); + if (u1 != u2 && Character.toLowerCase(u1) != Character.toLowerCase(u2)) { + return false; + } } } return true; diff --git a/src/test/java/org/apache/commons/text/TextStringBuilderTest.java b/src/test/java/org/apache/commons/text/TextStringBuilderTest.java index 3aafdb0d19..e2c74cbcf7 100644 --- a/src/test/java/org/apache/commons/text/TextStringBuilderTest.java +++ b/src/test/java/org/apache/commons/text/TextStringBuilderTest.java @@ -974,6 +974,16 @@ void testEqualsIgnoreCase() { sb2.set("aBc"); assertTrue(sb1.equalsIgnoreCase(sb2)); + // characters that only fold together via toLowerCase, matching String.equalsIgnoreCase + sb1.set("\u004B"); // LATIN CAPITAL LETTER K + sb2.set("\u212A"); // KELVIN SIGN, lower-cases to 'k' + assertTrue(sb1.equalsIgnoreCase(sb2)); + assertTrue(sb2.equalsIgnoreCase(sb1)); + + sb1.set("\u00E5"); // LATIN SMALL LETTER A WITH RING ABOVE + sb2.set("\u212B"); // ANGSTROM SIGN, lower-cases to the same + assertTrue(sb1.equalsIgnoreCase(sb2)); + final Locale turkish = Locale.forLanguageTag("tr"); assertTrue(new TextStringBuilder("title").equalsIgnoreCase(new TextStringBuilder("title".toLowerCase(turkish)))); assertTrue(new TextStringBuilder("title").equalsIgnoreCase(new TextStringBuilder("TITLE".toLowerCase(turkish))));