Make JSON.stringify not quote non-ASCII characters. Fix bug 855.
Review URL: http://codereview.chromium.org/3336001 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5398 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
780934e17f
commit
6670c0ad38
16
src/json.js
16
src/json.js
@ -68,15 +68,13 @@ function JSONParse(text, reviver) {
|
||||
}
|
||||
|
||||
var characterQuoteCache = {
|
||||
'\b': '\\b', // ASCII 8, Backspace
|
||||
'\t': '\\t', // ASCII 9, Tab
|
||||
'\n': '\\n', // ASCII 10, Newline
|
||||
'\f': '\\f', // ASCII 12, Formfeed
|
||||
'\r': '\\r', // ASCII 13, Carriage Return
|
||||
'\"': '\\"',
|
||||
'\\': '\\\\',
|
||||
'/': '\\/',
|
||||
'\b': '\\b',
|
||||
'\f': '\\f',
|
||||
'\n': '\\n',
|
||||
'\r': '\\r',
|
||||
'\t': '\\t',
|
||||
'\x0B': '\\u000b'
|
||||
'/': '\\/'
|
||||
};
|
||||
|
||||
function QuoteSingleJSONCharacter(c) {
|
||||
@ -95,7 +93,7 @@ function QuoteSingleJSONCharacter(c) {
|
||||
}
|
||||
|
||||
function QuoteJSONString(str) {
|
||||
var quotable = /[\\\"\x00-\x1f\x80-\uffff]/g;
|
||||
var quotable = /[\\\"\x00-\x1f]/g;
|
||||
return '"' + str.replace(quotable, QuoteSingleJSONCharacter) + '"';
|
||||
}
|
||||
|
||||
|
@ -317,3 +317,32 @@ TestInvalid('1); x++; (1');
|
||||
// Test string conversion of argument.
|
||||
var o = { toString: function() { return "42"; } };
|
||||
assertEquals(42, JSON.parse(o));
|
||||
|
||||
|
||||
for (var i = 0; i < 65536; i++) {
|
||||
var string = String.fromCharCode(i);
|
||||
var encoded = JSON.stringify(string);
|
||||
var expected = "uninitialized";
|
||||
// Following the ES5 specification of the abstraction function Quote.
|
||||
if (string == '"' || string == '\\') {
|
||||
// Step 2.a
|
||||
expected = '\\' + string;
|
||||
} else if ("\b\t\n\r\f".indexOf(string) >= 0) {
|
||||
// Step 2.b
|
||||
if (string == '\b') expected = '\\b';
|
||||
else if (string == '\t') expected = '\\t';
|
||||
else if (string == '\n') expected = '\\n';
|
||||
else if (string == '\f') expected = '\\f';
|
||||
else if (string == '\r') expected = '\\r';
|
||||
} else if (i < 32) {
|
||||
// Step 2.c
|
||||
if (i < 16) {
|
||||
expected = "\\u000" + i.toString(16);
|
||||
} else {
|
||||
expected = "\\u00" + i.toString(16);
|
||||
}
|
||||
} else {
|
||||
expected = string;
|
||||
}
|
||||
assertEquals('"' + expected + '"', encoded, "Codepoint " + i);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user