...
diff --git a/build.xml b/build.xml index 05f9ffc..a62dcaf 100644 --- a/build.xml +++ b/build.xml
@@ -50,7 +50,7 @@ <property name="IMPL_TITLE_SMILE" value="Jackson Binary format (aka Smile) handling functionality" /> <property name="IMPL_TITLE_MRBEAN" value="Jackson Bean Materializer (aka Mr. Bean)" /> - <property name="IMPL_VERSION" value="1.9.12" /> + <property name="IMPL_VERSION" value="1.9.13" /> <property name="IMPL_VENDOR" value="http://fasterxml.com" /> <patternset id="dist-all-source-files">
diff --git a/release-notes/VERSION b/release-notes/VERSION index f7f5ea6..e356c85 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION
@@ -12,6 +12,8 @@ * [JACKSON-875]: Enums are not properly serialized when Feature.USE_ANNOTATIONS is disabled (reported by Laurent P) +* [JACKSON-884]: JsonStringEncoder.quoteAsStringValue() fails to encode + ctrl chars correctly. * [Issue#38]: Infinite loop in `JsonParser.nextFieldName()` with trailing space after field name (reported by matjazs@github)
diff --git a/src/java/org/codehaus/jackson/io/JsonStringEncoder.java b/src/java/org/codehaus/jackson/io/JsonStringEncoder.java index b0798d0..ac201d2 100644 --- a/src/java/org/codehaus/jackson/io/JsonStringEncoder.java +++ b/src/java/org/codehaus/jackson/io/JsonStringEncoder.java
@@ -129,8 +129,12 @@ } } // something to escape; 2 or 6-char variant? - int escCode = escCodes[input.charAt(inPtr++)]; - int length = _appendSingleEscape(escCode, _quoteBuffer); + char d = input.charAt(inPtr++); + int escCode = escCodes[d]; + int length = (escCode < 0) + ? _appendNumericEscape(d, _quoteBuffer) + : _appendNamedEscape(escCode, _quoteBuffer); + ; if ((outPtr + length) > outputBuffer.length) { int first = outputBuffer.length - outPtr; if (first > 0) { @@ -144,7 +148,6 @@ System.arraycopy(_quoteBuffer, 0, outputBuffer, outPtr, length); outPtr += length; } - } textBuffer.setCurrentLength(outPtr); return textBuffer.contentsAsArray(); @@ -249,6 +252,7 @@ * Will encode given String as UTF-8 (without any quoting), return * resulting byte array. */ + @SuppressWarnings("resource") public byte[] encodeAsUTF8(String text) { ByteArrayBuilder byteBuilder = _byteBuilder; @@ -341,16 +345,17 @@ /********************************************************** */ - private int _appendSingleEscape(int escCode, char[] quoteBuffer) + private int _appendNumericEscape(int value, char[] quoteBuffer) { - if (escCode < 0) { // control char, value -(char + 1) - int value = -(escCode + 1); - quoteBuffer[1] = 'u'; - // We know it's a control char, so only the last 2 chars are non-0 - quoteBuffer[4] = HEX_CHARS[value >> 4]; - quoteBuffer[5] = HEX_CHARS[value & 0xF]; - return 6; - } + quoteBuffer[1] = 'u'; + // We know it's a control char, so only the last 2 chars are non-0 + quoteBuffer[4] = HEX_CHARS[value >> 4]; + quoteBuffer[5] = HEX_CHARS[value & 0xF]; + return 6; + } + + private int _appendNamedEscape(int escCode, char[] quoteBuffer) + { quoteBuffer[1] = (char) escCode; return 2; }
diff --git a/src/test/org/codehaus/jackson/io/TestJsonStringEncoder.java b/src/test/org/codehaus/jackson/io/TestJsonStringEncoder.java index 14670d3..cc8a850 100644 --- a/src/test/org/codehaus/jackson/io/TestJsonStringEncoder.java +++ b/src/test/org/codehaus/jackson/io/TestJsonStringEncoder.java
@@ -74,6 +74,14 @@ } } + // [JACKSON-884] + public void testCtrlChars() throws Exception + { + char[] input = new char[] { 0, 1, 2, 3, 4 }; + char[] quoted = JsonStringEncoder.getInstance().quoteAsString(new String(input)); + assertEquals("\\u0000\\u0001\\u0002\\u0003\\u0004", new String(quoted)); + } + /* /********************************************************** /* Helper methods