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 243d3fe49 Emit surrogate pair for supplementary code points in 
UnicodeEscaper (#1726)
243d3fe49 is described below

commit 243d3fe492900d6338e619b1050f83d8052e8bdb
Author: alhuda <[email protected]>
AuthorDate: Tue Jun 23 20:15:18 2026 +0530

    Emit surrogate pair for supplementary code points in UnicodeEscaper (#1726)
---
 .../apache/commons/lang3/text/translate/UnicodeEscaper.java    |  9 +++++++--
 .../commons/lang3/text/translate/UnicodeEscaperTest.java       | 10 ++++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java 
b/src/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java
index 9113d5707..7401328bb 100644
--- a/src/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java
+++ b/src/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java
@@ -102,7 +102,8 @@ protected UnicodeEscaper(final int below, final int above, 
final boolean between
     }
 
     /**
-     * Converts the given code point to a hexadecimal string of the form 
{@code "\\uXXXX"}
+     * Converts the given code point to a hexadecimal string of the form 
{@code "\\uXXXX"}, or the
+     * surrogate pair form {@code "\\uXXXX\\uXXXX"} for a supplementary code 
point.
      *
      * @param codePoint
      *            a Unicode code point.
@@ -110,7 +111,11 @@ protected UnicodeEscaper(final int below, final int above, 
final boolean between
      * @since 3.2
      */
     protected String toUtf16Escape(final int codePoint) {
-        return "\\u" + hex(codePoint);
+        if (Character.isBmpCodePoint(codePoint)) {
+            return "\\u" + hex(codePoint);
+        }
+        final char[] surrogatePair = Character.toChars(codePoint);
+        return "\\u" + hex(surrogatePair[0]) + "\\u" + hex(surrogatePair[1]);
     }
 
     /**
diff --git 
a/src/test/java/org/apache/commons/lang3/text/translate/UnicodeEscaperTest.java 
b/src/test/java/org/apache/commons/lang3/text/translate/UnicodeEscaperTest.java
index e11fb220c..6d2094943 100644
--- 
a/src/test/java/org/apache/commons/lang3/text/translate/UnicodeEscaperTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/text/translate/UnicodeEscaperTest.java
@@ -51,4 +51,14 @@ void testBetween() {
         final String result = ue.translate(input);
         assertEquals("AD\\u0046\\u0047Z", result, "Failed to escape Unicode 
characters via the between method");
     }
+
+    @Test
+    void testSupplementary() {
+        final UnicodeEscaper ue = UnicodeEscaper.above(0x7f);
+        // U+10437 (DESERET SMALL LETTER YEE) encodes to surrogate pair U+D801 
U+DC37.
+        final String input = new String(Character.toChars(0x10437));
+        final String result = ue.translate(input);
+        assertEquals("\\uD801\\uDC37", result, "Supplementary code point must 
escape to a surrogate pair");
+        assertEquals(input, new UnicodeUnescaper().translate(result), "Escaped 
supplementary code point must round-trip");
+    }
 }

Reply via email to