提问者:小点点

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


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

http://jsfiddle.net/Mhgy5/

超文本标记语言:

<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>

JavaScript:

​$("#encode").click(function () {
    $("#out").text(JSON.stringify({ txt: $("#txt").val() }));
}).click();
​

虽然我希望根据 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 的形式传输。


共2个答案

匿名用户

JSON 规范不要求从 unicode 字符转换为转义序列。“除” 或 \ 或控制字符“之外的任何 UNICODE 字符”被定义为有效的 JSON 序列化字符串:

匿名用户

事实上JSON.stringify不能逃脱utf8:

JSON.stringify({a:"Привет!"})
{"a":"Привет!"}

但是我在通过PerlDBD::MySQL构建JSON然后检索它时遇到了一个问题。我发现遵循建议通过\uXXXX转义所有非ascii和不可见字符更安全。以下是方法

function jsonEscapeUTF(s) {return s.replace(/[^\x20-\x7F]/g, x => "\\u" + ("000"+x.codePointAt(0).toString(16)).slice(-4))}

jsonEscapeUTF(JSON.stringify({a:"Привет!"}))
"{"a":"\u041f\u0440\u0438\u0432\u0435\u0442!"}"

希望它会有所帮助。