diff --git a/CHANGES.txt b/CHANGES.txt index 94d8f87763fc1bf0796d88918d9b1586e564e246_Q0hBTkdFUy50eHQ=..31f4f0fb52d83e3c4e414840469610809dc7e2ff_Q0hBTkdFUy50eHQ= 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,7 @@ Version 2.1.7 released 2011-XX-XX +* Force unicode linebreak characters to be escaped (U+2028 and U+2029) + http://timelessrepo.com/json-isnt-a-javascript-subset * Moved documentation from a git submodule to http://simplejson.readthedocs.org/ diff --git a/simplejson/encoder.py b/simplejson/encoder.py index 94d8f87763fc1bf0796d88918d9b1586e564e246_c2ltcGxlanNvbi9lbmNvZGVyLnB5..31f4f0fb52d83e3c4e414840469610809dc7e2ff_c2ltcGxlanNvbi9lbmNvZGVyLnB5 100644 --- a/simplejson/encoder.py +++ b/simplejson/encoder.py @@ -13,7 +13,7 @@ from simplejson.decoder import PosInf -ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]') +ESCAPE = re.compile(ur'[\x00-\x1f\\"\b\f\n\r\t\u2028\u2029]') ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') HAS_UTF8 = re.compile(r'[\x80-\xff]') ESCAPE_DCT = { @@ -24,6 +24,8 @@ '\n': '\\n', '\r': '\\r', '\t': '\\t', + u'\u2028': '\\u2028', + u'\u2029': '\\u2029', } for i in range(0x20): #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) diff --git a/simplejson/tests/test_unicode.py b/simplejson/tests/test_unicode.py index 94d8f87763fc1bf0796d88918d9b1586e564e246_c2ltcGxlanNvbi90ZXN0cy90ZXN0X3VuaWNvZGUucHk=..31f4f0fb52d83e3c4e414840469610809dc7e2ff_c2ltcGxlanNvbi90ZXN0cy90ZXN0X3VuaWNvZGUucHk= 100644 --- a/simplejson/tests/test_unicode.py +++ b/simplejson/tests/test_unicode.py @@ -97,3 +97,13 @@ self.assertEquals(json.dumps(doc2), doc_ascii) self.assertEquals(json.dumps(doc1, ensure_ascii=False), doc_unicode) self.assertEquals(json.dumps(doc2, ensure_ascii=False), doc_unicode) + + def test_ensure_ascii_linebreak_encoding(self): + # http://timelessrepo.com/json-isnt-a-javascript-subset + s1 = u'\u2029\u2028' + s2 = s1.encode('utf8') + expect = '"\\u2029\\u2028"' + self.assertEquals(json.dumps(s1), expect) + self.assertEquals(json.dumps(s2), expect) + self.assertEquals(json.dumps(s1, ensure_ascii=False), expect) + self.assertEquals(json.dumps(s2, ensure_ascii=False), expect)