...
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