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-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new 6bef246b2 keep initials from splitting a supplementary code point 
(#1722)
6bef246b2 is described below

commit 6bef246b2f10699a56a3010bbc6fa11d241430c6
Author: alhuda <[email protected]>
AuthorDate: Sat Jun 20 22:33:24 2026 +0530

    keep initials from splitting a supplementary code point (#1722)
---
 src/main/java/org/apache/commons/lang3/text/WordUtils.java     | 6 +++++-
 src/test/java/org/apache/commons/lang3/text/WordUtilsTest.java | 8 ++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/commons/lang3/text/WordUtils.java 
b/src/main/java/org/apache/commons/lang3/text/WordUtils.java
index feed32d15..e7c4907c5 100644
--- a/src/main/java/org/apache/commons/lang3/text/WordUtils.java
+++ b/src/main/java/org/apache/commons/lang3/text/WordUtils.java
@@ -265,7 +265,7 @@ public static String initials(final String str, final 
char... delimiters) {
             return StringUtils.EMPTY;
         }
         final int strLen = str.length();
-        final char[] buf = new char[strLen / 2 + 1];
+        final char[] buf = new char[strLen];
         int count = 0;
         boolean lastWasGap = true;
         for (int i = 0; i < strLen; i++) {
@@ -276,6 +276,10 @@ public static String initials(final String str, final 
char... delimiters) {
             }
             if (lastWasGap) {
                 buf[count++] = ch;
+                // keep a supplementary code point's low surrogate with its 
high half
+                if (Character.isHighSurrogate(ch) && i + 1 < strLen && 
Character.isLowSurrogate(str.charAt(i + 1))) {
+                    buf[count++] = str.charAt(++i);
+                }
                 lastWasGap = false;
             }
         }
diff --git a/src/test/java/org/apache/commons/lang3/text/WordUtilsTest.java 
b/src/test/java/org/apache/commons/lang3/text/WordUtilsTest.java
index 479b62640..305f01c2c 100644
--- a/src/test/java/org/apache/commons/lang3/text/WordUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/text/WordUtilsTest.java
@@ -185,6 +185,14 @@ void testInitials_String() {
         assertEquals("iah1", WordUtils.initials("i am here 123"));
     }
 
+    @Test
+    void testInitials_SupplementaryCodePoint() {
+        final String emoji = new String(Character.toChars(0x1F600));
+        assertEquals("B" + emoji + "L", WordUtils.initials("Ben " + emoji + 
"mile Lee"));
+        assertEquals(emoji, WordUtils.initials(emoji + "abc"));
+        assertEquals("B" + emoji + "L", WordUtils.initials("Ben." + emoji + 
"mile.Lee", '.'));
+    }
+
     @Test
     void testInitials_String_charArray() {
         char[] array = null;

Reply via email to