You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2020/05/25 13:41:30 UTC

[commons-lang] branch master updated: [LANG-1545] CharSequenceUtils.regionMatches is wrong dealing with Georgian. (#529)

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new 2c7e5e4  [LANG-1545] CharSequenceUtils.regionMatches is wrong dealing with Georgian. (#529)
2c7e5e4 is described below

commit 2c7e5e4b29c80d5475e971232458d3481bbe7136
Author: XenoAmess <xe...@gmail.com>
AuthorDate: Mon May 25 21:41:18 2020 +0800

    [LANG-1545] CharSequenceUtils.regionMatches is wrong dealing with Georgian. (#529)
    
    * CharSequenceUtils.regionMatches is wrong dealing with Georgian.
    see details in tests.
    * refine tests
---
 .../apache/commons/lang3/CharSequenceUtils.java    |  7 +++---
 .../org/apache/commons/lang3/StringUtilsTest.java  | 27 ++++++++++++++++++++++
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java b/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
index 58c0453..fdb9122 100644
--- a/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
+++ b/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
@@ -294,9 +294,10 @@ public class CharSequenceUtils {
                 return false;
             }
 
-            // The same check as in String.regionMatches():
-            if (Character.toUpperCase(c1) != Character.toUpperCase(c2)
-                    && Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
+            // The real same check as in String.regionMatches():
+            char u1 = Character.toUpperCase(c1);
+            char u2 = Character.toUpperCase(c2);
+            if (u1 != u2 && Character.toLowerCase(u1) != Character.toLowerCase(u2)) {
                 return false;
             }
         }
diff --git a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
index 30263de..cea53a2 100644
--- a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
@@ -3305,4 +3305,31 @@ public class StringUtilsTest {
             Locale.setDefault(defaultLocales);
         }
     }
+
+    @Test
+    public void testGeorgianSample() {
+        char[] arrayI = new char[]{
+                //Latin Small Letter dotless I
+                (char) 0x0131,
+                //Greek Capital Letter Theta
+                (char) 0x03F4
+        };
+        char[] arrayJ = new char[]{
+                //Latin Capital Letter I with dot above
+                (char) 0x0130,
+                //Greek Theta Symbol
+                (char) 0x03D1
+        };
+        for (char i : arrayI) {
+            for (char j : arrayJ) {
+                String si = "" + i;
+                String sj = "" + j;
+                boolean res1 = si.equalsIgnoreCase(sj);
+                CharSequence ci = new StringBuilder(si);
+                CharSequence cj = new StringBuilder(sj);
+                boolean res2 = StringUtils.startsWithIgnoreCase(ci, cj);
+                assertEquals(res1, res2, "si : " + si + " sj : " + sj);
+            }
+        }
+    }
 }