diff --git a/Stringer.js b/Stringer.js index df23c21..d54e330 100644 --- a/Stringer.js +++ b/Stringer.js @@ -26,7 +26,7 @@ const noCommaAfter = {startObject: 1, startArray: 1, endKey: 1, keyValue: 1}, }; const skipValue = endName => - function(chunk, encoding, callback) { + function (chunk, encoding, callback) { if (chunk.name === endName) { this._transform = this._prev_transform; } @@ -34,7 +34,10 @@ const skipValue = endName => }; const replaceSymbols = {'\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', '"': '\\"', '\\': '\\\\'}; -const sanitizeString = value => value.replace(/[\b\f\n\r\t\"\\]/g, match => replaceSymbols[match]); +const sanitizeString = value => + value.replace(/[\b\f\n\r\t\"\\\u0000-\u001F\u007F-\u009F]/g, match => + replaceSymbols.hasOwnProperty(match) ? replaceSymbols[match] : '\\u' + ('0000' + match.charCodeAt(0).toString(16)).slice(-4) + ); const doNothing = () => {}; @@ -87,7 +90,7 @@ class Stringer extends Transform { this.push('"' + sanitizeString(chunk.value) + '":'); break; case 'stringValue': - this.push('"' + sanitizeString(chunk.value)+ '"'); + this.push('"' + sanitizeString(chunk.value) + '"'); break; case 'numberValue': this.push(chunk.value); diff --git a/tests/test_stringer.js b/tests/test_stringer.js index 9f3539e..424a4fe 100644 --- a/tests/test_stringer.js +++ b/tests/test_stringer.js @@ -208,7 +208,7 @@ unit.add(module, [ const parser = makeParser({jsonStreaming: true}), stringer = new Stringer(), object = { - message: "Test\tmessage\nWith\bnew\fline\r\ntest\\..." + message: "Test\tmessage\nWith\bnew\flineAndControlCharacters\u001F\r\ntest\\..." }, string = JSON.stringify(object); let buffer = '';