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;