This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-text.git
The following commit(s) were added to refs/heads/master by this push:
new ddaad175 Match String case folding in
TextStringBuilder.equalsIgnoreCase (#762)
ddaad175 is described below
commit ddaad175af54fd19f47015c87357052af0618040
Author: alhuda <[email protected]>
AuthorDate: Sat Jul 11 20:36:48 2026 +0530
Match String case folding in TextStringBuilder.equalsIgnoreCase (#762)
---
src/main/java/org/apache/commons/text/TextStringBuilder.java | 8 ++++++--
.../java/org/apache/commons/text/TextStringBuilderTest.java | 10 ++++++++++
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/apache/commons/text/TextStringBuilder.java
b/src/main/java/org/apache/commons/text/TextStringBuilder.java
index a3997bff..64baa303 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 class TextStringBuilder implements CharSequence,
Appendable, Serializable
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 3aafdb0d..e2c74cbc 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 @@ class TextStringBuilderTest {
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))));