diff --git a/fesod-common/src/main/java/org/apache/fesod/common/util/StringUtils.java b/fesod-common/src/main/java/org/apache/fesod/common/util/StringUtils.java index abd801601b..ba71176c5f 100644 --- a/fesod-common/src/main/java/org/apache/fesod/common/util/StringUtils.java +++ b/fesod-common/src/main/java/org/apache/fesod/common/util/StringUtils.java @@ -198,8 +198,9 @@ public static boolean regionMatches( } // The same check as in String.regionMatches(): - if (Character.toUpperCase(c1) != Character.toUpperCase(c2) - && Character.toLowerCase(c1) != Character.toLowerCase(c2)) { + final char upper1 = Character.toUpperCase(c1); + final char upper2 = Character.toUpperCase(c2); + if (upper1 != upper2 && Character.toLowerCase(upper1) != Character.toLowerCase(upper2)) { return false; } } diff --git a/fesod-common/src/test/java/org/apache/fesod/common/util/StringUtilsTest.java b/fesod-common/src/test/java/org/apache/fesod/common/util/StringUtilsTest.java index 0f4ec3d0a4..52432b99c9 100644 --- a/fesod-common/src/test/java/org/apache/fesod/common/util/StringUtilsTest.java +++ b/fesod-common/src/test/java/org/apache/fesod/common/util/StringUtilsTest.java @@ -211,6 +211,28 @@ boolean invoke() { } } + @Test + void test_regionMatches_unicodeIgnoreCase() { + final CharSequence[] dottedI = {"İ", new StringBuilder("İ")}; + final CharSequence[] dotlessI = {"ı", new StringBuilder("ı")}; + for (final CharSequence source : dottedI) { + for (final CharSequence other : dotlessI) { + Assertions.assertEquals( + source.toString().regionMatches(true, 0, other.toString(), 0, 1), + StringUtils.regionMatches(source, true, 0, other, 0, 1)); + Assertions.assertEquals( + other.toString().regionMatches(true, 0, source.toString(), 0, 1), + StringUtils.regionMatches(other, true, 0, source, 0, 1)); + Assertions.assertEquals( + source.toString().regionMatches(false, 0, other.toString(), 0, 1), + StringUtils.regionMatches(source, false, 0, other, 0, 1)); + Assertions.assertEquals( + other.toString().regionMatches(false, 0, source.toString(), 0, 1), + StringUtils.regionMatches(other, false, 0, source, 0, 1)); + } + } + } + @Test void stripTest() { Assertions.assertNull(StringUtils.strip(null));