From 5a9ddfb328f5eaaa057c251def021d0cd1bca48e Mon Sep 17 00:00:00 2001 From: xtonik Date: Thu, 25 Jan 2024 20:48:06 +0100 Subject: [PATCH] surrogate conversion simplified --- .../fasterxml/jackson/core/base/GeneratorBase.java | 4 ++-- .../fasterxml/jackson/core/io/JsonStringEncoder.java | 2 +- .../com/fasterxml/jackson/core/io/UTF8Writer.java | 4 +++- .../fasterxml/jackson/core/io/UTF8WriterTest.java | 12 ++++++++++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java b/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java index 625a12513c..db136e28b4 100644 --- a/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java +++ b/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.core.io.IOContext; +import com.fasterxml.jackson.core.io.UTF8Writer; import com.fasterxml.jackson.core.json.DupDetector; import com.fasterxml.jackson.core.json.JsonWriteContext; import com.fasterxml.jackson.core.json.PackageVersion; @@ -533,8 +534,7 @@ protected final int _decodeSurrogate(int surr1, int surr2) throws IOException "Incomplete surrogate pair: first char 0x%04X, second 0x%04X", surr1, surr2); _reportError(msg); } - int c = 0x10000 + ((surr1 - SURR1_FIRST) << 10) + (surr2 - SURR2_FIRST); - return c; + return (surr1 << 10) + surr2 + UTF8Writer.SURROGATE_BASE; } /* diff --git a/src/main/java/com/fasterxml/jackson/core/io/JsonStringEncoder.java b/src/main/java/com/fasterxml/jackson/core/io/JsonStringEncoder.java index 87487459af..4260b4675f 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/JsonStringEncoder.java +++ b/src/main/java/com/fasterxml/jackson/core/io/JsonStringEncoder.java @@ -659,7 +659,7 @@ private static int _convert(int p1, int p2) { if (p2 < SURR2_FIRST || p2 > SURR2_LAST) { throw new IllegalArgumentException("Broken surrogate pair: first char 0x"+Integer.toHexString(p1)+", second 0x"+Integer.toHexString(p2)+"; illegal combination"); } - return 0x10000 + ((p1 - SURR1_FIRST) << 10) + (p2 - SURR2_FIRST); + return (p1 << 10) + p2 + UTF8Writer.SURROGATE_BASE; } private static void _illegal(int c) { diff --git a/src/main/java/com/fasterxml/jackson/core/io/UTF8Writer.java b/src/main/java/com/fasterxml/jackson/core/io/UTF8Writer.java index b7561839d1..f6e2f4ca4b 100644 --- a/src/main/java/com/fasterxml/jackson/core/io/UTF8Writer.java +++ b/src/main/java/com/fasterxml/jackson/core/io/UTF8Writer.java @@ -9,6 +9,8 @@ public final class UTF8Writer extends Writer final static int SURR2_FIRST = 0xDC00; final static int SURR2_LAST = 0xDFFF; + public static final int SURROGATE_BASE = 0x10000 - UTF8Writer.SURR2_FIRST - (UTF8Writer.SURR1_FIRST << 10); + final private IOContext _context; private OutputStream _out; @@ -369,7 +371,7 @@ protected int convertSurrogate(int secondPart) if (secondPart < SURR2_FIRST || secondPart > SURR2_LAST) { throw new IOException("Broken surrogate pair: first char 0x"+Integer.toHexString(firstPart)+", second 0x"+Integer.toHexString(secondPart)+"; illegal combination"); } - return 0x10000 + ((firstPart - SURR1_FIRST) << 10) + (secondPart - SURR2_FIRST); + return (firstPart << 10) + secondPart + UTF8Writer.SURROGATE_BASE; } protected static void illegalSurrogate(int code) throws IOException { diff --git a/src/test/java/com/fasterxml/jackson/core/io/UTF8WriterTest.java b/src/test/java/com/fasterxml/jackson/core/io/UTF8WriterTest.java index 1907b9bf82..a4bd10b490 100644 --- a/src/test/java/com/fasterxml/jackson/core/io/UTF8WriterTest.java +++ b/src/test/java/com/fasterxml/jackson/core/io/UTF8WriterTest.java @@ -3,6 +3,7 @@ import java.io.*; import org.junit.Assert; +import org.junit.Ignore; public class UTF8WriterTest extends com.fasterxml.jackson.core.BaseTest @@ -136,6 +137,17 @@ public void testSurrogatesFail() throws Exception } } + @Ignore + public void testSurrogateConversion() { + for (int first = UTF8Writer.SURR1_FIRST; first <= UTF8Writer.SURR1_LAST; first++) { + for (int second = UTF8Writer.SURR2_FIRST; second <= UTF8Writer.SURR2_LAST; second++) { + int expected = 0x10000 + ((first - UTF8Writer.SURR1_FIRST) << 10) + (second - UTF8Writer.SURR2_FIRST); + int actual = (first << 10) + second + UTF8Writer.SURROGATE_BASE; + assertEquals(Integer.toHexString(first) + " " + Integer.toHexString(second), expected, actual); + } + } + } + private IOContext _ioContext() { return testIOContext(); }