From 58c86059c60bc27e9eadba5735da5a40b47f6005 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Wed, 25 Mar 2015 21:54:29 +0200 Subject: [PATCH] Only escape quotation mark, backslash and cntrl U+0000 to U+001F * lisp/json.el (json-special-chars): Don't treat `/' specially, there's no need to. (json-encode-string): Only escape quotation mark, backslash and the control characters U+0000 to U+001F. --- lisp/ChangeLog | 7 +++++++ lisp/json.el | 6 +++--- test/automated/json-tests.el | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2d150ba3dd2..56c2b4c6f98 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2015-03-25 Dmitry Gutov + + * json.el (json-special-chars): Don't treat `/' specially, there's + no need to. + (json-encode-string): Only escape quotation mark, backslash and + the control characters U+0000 to U+001F. + 2015-03-25 Artur Malabarba * emacs-lisp/checkdoc.el (checkdoc-this-string-valid-engine): diff --git a/lisp/json.el b/lisp/json.el index a1e9bb78d11..eaf8596a6dc 100644 --- a/lisp/json.el +++ b/lisp/json.el @@ -258,7 +258,6 @@ representation will be parsed correctly." (defvar json-special-chars '((?\" . ?\") (?\\ . ?\\) - (?/ . ?/) (?b . ?\b) (?f . ?\f) (?n . ?\n) @@ -313,8 +312,9 @@ representation will be parsed correctly." (let ((l (length string)) (start 0) res mb) - ;; Skip over ASCIIish printable characters. - (while (setq mb (string-match "[\"\\/\b\f\n\r\t]\\|[^ -~]" string start)) + ;; Only escape quotation mark, backslash and the control + ;; characters U+0000 to U+001F (RFC 4627, ECMA-404). + (while (setq mb (string-match "[\"\\[:cntrl:]]" string start)) (let* ((c (aref string mb)) (special (rassq c json-special-chars))) (push (substring string start mb) res) diff --git a/test/automated/json-tests.el b/test/automated/json-tests.el index 881c237261c..fd89b7aa994 100644 --- a/test/automated/json-tests.el +++ b/test/automated/json-tests.el @@ -35,8 +35,8 @@ (ert-deftest json-encode-string-with-special-chars () (should (equal (json-encode-string "a\n\fb") "\"a\\n\\fb\"")) - (should (equal (json-encode-string "\nasdфывfgh\t") - "\"\\nasd\\u0444\\u044b\\u0432fgh\\t\""))) + (should (equal (json-encode-string "\nasdфыв\u001f\u007ffgh\t") + "\"\\nasdфыв\\u001f\u007ffgh\\t\""))) (ert-deftest json-read-string-with-special-chars () (should (equal (json-read-from-string "\"\\nasd\\u0444\\u044b\\u0432fgh\\t\"") -- 2.11.4.GIT