diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py --- a/mercurial/templatefilters.py +++ b/mercurial/templatefilters.py @@ -156,9 +156,10 @@ def json(obj): elif isinstance(obj, int) or isinstance(obj, float): return str(obj) elif isinstance(obj, str): - return '"%s"' % jsonescape(obj) + u = unicode(obj, encoding.encoding, 'replace') + return '"%s"' % jsonescape(u).encode('utf-8') elif isinstance(obj, unicode): - return json(obj.encode('utf-8')) + return '"%s"' % jsonescape(obj).encode('utf-8') elif hasattr(obj, 'keys'): out = [] for k, v in obj.iteritems(): diff --git a/tests/test-hgweb-commands b/tests/test-hgweb-commands --- a/tests/test-hgweb-commands +++ b/tests/test-hgweb-commands @@ -60,5 +60,19 @@ echo % failing unbundle, requires POST r echo % Static files "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/static/style.css' +echo % Stop and restart with HGENCODING=cp932 +"$TESTDIR/killdaemons.py" +HGENCODING=cp932 hg serve --config server.uncompressed=False -n test \ + -p $HGPORT -d --pid-file=hg.pid -E errors.log +cat hg.pid >> $DAEMON_PIDS + +# commit message with Japanese Kanji 'Noh', which ends with '\x5c' +echo foo >> foo +HGENCODING=cp932 hg ci -m `python -c 'print("\x94\x5c")'` + +echo % Graph json escape of multibyte character +"$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/' \ + | grep '^var data =' + echo % ERRORS ENCOUNTERED cat errors.log 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 @@ -982,4 +982,7 @@ ul#graphnodes li .info { position: relative; top: -1px; } +% 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"]]]; % ERRORS ENCOUNTERED