JSON.stringify不应该转义Unicode字符吗?

Ate*_*ral 10 javascript unicode json

我有一个简单的UTF-8测试页面,其中带有多种不同语言字母的文本被字符串化为JSON:

http://jsfiddle.net/Mhgy5/

HTML:

<textarea id="txt">
?? • Busca • Sök • ?? • Tìm ki?m • ????? • Cerca • Søk • Haku • Hledání • Keresés • ?? • Cari • Ara • ????? • C?utare • ??? • H?ada? • Søg • Ser?u • ???????? • Paieška • Poiš?i • Cari • ????? • ??????? • ????? • Bilatu • Suk • Bilnga • Traži • ?????
</textarea>
<button id="encode">Encode</button>
<pre id="out">
</pre>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

?$("#encode").click(function () {
    $("#out").text(JSON.stringify({ txt: $("#txt").val() }));
}).click();
?
Run Code Online (Sandbox Code Playgroud)

虽然我希望根据JSON规范将非ASCII字符转义为\ uXXXX ,但它们似乎不受影响.这是我从上面的测试得到的输出:

{"txt":"?? • Busca • Sök • ?? • Tìm ki?m • ????? • Cerca • Søk • Haku • Hledání • Keresés • ?? • Cari • Ara • ????? • C?utare • ??? • H?ada? • Søg • Ser?u • ???????? • Paieška • Poiš?i • Cari • ????? • ??????? • ????? • Bilatu • Suk • Bilnga • Traži • ?????\n"}

我正在使用Chrome,因此它应该是原生JSON.stringify实现.页面的编码是UTF-8.不能转义非ASCII字符吗?

首先让我参加这个测试的是,我注意到jQuery.ajax当它们出现在数据对象属性中时似乎没有转义非ASCII字符.字符似乎以UTF-8传输.

Rob*_*b W 33

JSON规范并不要求从Unicode字符转换为转义序列."除"或\或控制字符."之外的任何UNICODE字符都被定义为有效的JSON序列化字符串:

json字符串格式

  • 仅仅因为它不是规范所要求的,并不意味着它不值得实现。事实上,`\uXXXX` 格式就在底部,经常需要与外部服务和/或超过 7 位表示形式不“安全”的传输进行互操作。事实上,JS 的原生 JSON 编码器从根本上无法生成符合其自身规范的输出,这一事实是可笑的,而且各种解决方法本身经常导致各自堆栈中的完全相同的问题。 (4认同)

okh*_*rch 12

事实上 JSON.stringify 不会转义 utf8:

\n
JSON.stringify({a:"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!"})\n{"a":"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!"}\n
Run Code Online (Sandbox Code Playgroud)\n

但我在通过 Perl DBD::Mysql 存储 JSON 然后将其检索回来时遇到了问题。\n我发现按照建议通过 \\uXXXX 转义所有非 ASCII 和不可见字符更安全。\n以下是方法

\n
function jsonEscapeUTF(s) {return s.replace(/[^\\x20-\\x7F]/g, x => "\\\\u" + ("000"+x.codePointAt(0).toString(16)).slice(-4))}\n\njsonEscapeUTF(JSON.stringify({a:"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!"}))\n"{"a":"\\u041f\\u0440\\u0438\\u0432\\u0435\\u0442!"}"\n
Run Code Online (Sandbox Code Playgroud)\n

希望它会有所帮助。

\n


Cso*_*mai 5

你问题的简短回答是否定的; JSON.stringify不应该逃避你的字符串.

虽然如果用编码保存HTML文件但是没有声明它是utf8文件,处理utf8字符串会显得很奇怪.utf-8

例如:

<!doctype html>
<html>
    <head>
        <title></title>
        <script>
            var data="árvízt?r? tükörfúrógép ÁRVÍZT?R? TÜKÖRFÚRÓGÉP";
            alert(JSON.stringify(data));
        </script>
    </head>
</html>
Run Code Online (Sandbox Code Playgroud)

这会引起警觉"árvíztűrÅ‘ tükörfúrógép ÃRVÃZTŰRÅ TÜKÖRFÚRÓGÉP".

但是,如果您将以下行添加到标题:

<meta charset="UTF-8">
Run Code Online (Sandbox Code Playgroud)

然后,警报将是人们可以期待的:"árvízt?r? tükörfúrógép ÁRVÍZT?R? TÜKÖRFÚRÓGÉP".