diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py --- a/mercurial/templatefilters.py +++ b/mercurial/templatefilters.py @@ -148,7 +148,13 @@ def xmlescape(text): def jsonescape(s): for k, v in _escapes: s = s.replace(k, v) - return s + + def uescape(c): + if ord(c) < 0x80: + return c + else: + return '\\u%04x' % ord(c) + return ''.join(uescape(c) for c in s) def json(obj): if obj is None or obj is False or obj is True: @@ -157,9 +163,9 @@ def json(obj): return str(obj) elif isinstance(obj, str): u = unicode(obj, encoding.encoding, 'replace') - return '"%s"' % jsonescape(u).encode('utf-8') + return '"%s"' % jsonescape(u) elif isinstance(obj, unicode): - return '"%s"' % jsonescape(obj).encode('utf-8') + return '"%s"' % jsonescape(obj) elif hasattr(obj, 'keys'): out = [] for k, v in obj.iteritems(): diff --git a/tests/test-hgweb-commands.out b/tests/test-hgweb-commands.out --- a/tests/test-hgweb-commands.out +++ b/tests/test-hgweb-commands.out @@ -984,5 +984,5 @@ ul#graphnodes li .info { } % Stop and restart with HGENCODING=cp932 % Graph json escape of multibyte character -var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "能", "test", "1970-01-01", ["stable", true], ["tip"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], []], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]]; +var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "\u80fd", "test", "1970-01-01", ["stable", true], ["tip"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], []], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]]; % ERRORS ENCOUNTERED