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");
+ }
}