Fixed [Issue-2], decoding problem with surrogate pairs, long strings.
diff --git a/release-notes/VERSION b/release-notes/VERSION index 883816d..177281b 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION
@@ -8,6 +8,9 @@ Fixes: + * [Smile/Issue-2] SmileParser failed to decode surrogate-pair characters for + long Strings + (reported by Steven S) * [Issue-11] JsonParser.getValueAsLong() returning int, not long (reported by Daniel L) * [JACKSON-829] Custom serializers not working for List<String> properties,
diff --git a/src/smile/java/org/codehaus/jackson/smile/SmileParser.java b/src/smile/java/org/codehaus/jackson/smile/SmileParser.java index 0d2c4bb..cf908e3 100644 --- a/src/smile/java/org/codehaus/jackson/smile/SmileParser.java +++ b/src/smile/java/org/codehaus/jackson/smile/SmileParser.java
@@ -352,9 +352,10 @@ @Override public JsonLocation getCurrentLocation() { + long byteOffset = _currInputProcessed + _inputPtr; return new JsonLocation(_ioContext.getSourceReference(), - _currInputProcessed + _inputPtr, // bytes - -1, -1, -1); // char offset, line, column + byteOffset, // bytes + -1, -1, (int) byteOffset); // char offset, line, column } /* @@ -2220,7 +2221,7 @@ c = _decodeUtf8_3(c); } break; - case 4: // 4-byte UTF + case 3: // 4-byte UTF c = _decodeUtf8_4(c); // Let's add first part right away: outBuf[outPtr++] = (char) (0xD800 | (c >> 10));
diff --git a/src/test/org/codehaus/jackson/smile/TestSmileParserUnicode.java b/src/test/org/codehaus/jackson/smile/TestSmileParserUnicode.java new file mode 100644 index 0000000..b73ad3d --- /dev/null +++ b/src/test/org/codehaus/jackson/smile/TestSmileParserUnicode.java
@@ -0,0 +1,27 @@ +package org.codehaus.jackson.smile; + +import java.io.IOException; + +import org.codehaus.jackson.JsonToken; + +public class TestSmileParserUnicode extends SmileTestBase +{ + // [Issue-2]: probs with Surrogate handling + public void testLongUnicodeWithSurrogates() throws IOException + { + final String SURROGATE_CHARS = "\ud834\udd1e"; + StringBuilder sb = new StringBuilder(300); + while (sb.length() < 300) { + sb.append(SURROGATE_CHARS); + } + final String TEXT = sb.toString(); + byte[] data = _smileDoc(quote(TEXT)); + + SmileParser p = _smileParser(data); + assertNull(p.getCurrentToken()); + assertToken(JsonToken.VALUE_STRING, p.nextToken()); + assertEquals(TEXT, p.getText()); + assertNull(p.nextToken()); + } + +}