当前位置: 首页 > 知识库问答 >
问题:

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

屠锐
2023-03-14

我有一个简单的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个答案

龚俊捷
2023-03-14

事实上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!"}"

希望它会有所帮助。

斜向文
2023-03-14

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

 类似资料:
  • 问题内容: 我在UTF-8中有一个简单的测试页,其中带有多种不同语言字母的文本被字符串化为JSON: http://jsfiddle.net/Mhgy5/ HTML: JavaScript: 虽然我希望根据JSON规范将非ASCII字符转义为\ uXXXX ,但它们似乎未受影响。这是我从上述测试中获得的输出: 我使用的是Chrome,因此应该是本机实现。页面的编码为UTF-8。非ASCII字符不应

  • 问题内容: 我使用函数对AJAX发送到PHP的JS对象进行字符串化处理。 当JSON.stringify函数将Unicode字符编码为格式(例如)时,就会出现问题。我的问题是如何在PHP中将这些字符转换为常规unicode字符? 问题答案: 看到输出UTF-16?有点卡住 这将转换为UTF-8:

  • 问题内容: 在解析包含unicode转义序列的json字符串时,存在一个长期存在的错误。似乎需要修复该错误,这种错误可能很快就不会发生,因此我正在寻找一种在R中创建解决方法的方法,该方法在将序列提供给json解析器之前先取消序列化。 一些上下文:json数据始终是unicode,默认情况下使用,因此通常不需要转义。但是出于历史原因,json确实支持转义的unicode。因此json数据 和 是等效

  • 我需要将输入字符串中的unicode字符转义为UTF-16或UTF-32转义序列。例如,输入字符串文字< code >“吃,喝,愛" 应该转义为< code >“吃喝,\ u611b”。以下是排序表中的规则: Escape | Unicode码位 “\u” 十六进制 十六进制 十六进制|U 到 U FFFF 范围内的 Unicode 代码点(包括与编码的十六进制值相对应)。 '\U'HEX HEX

  • 问题内容: 如果您有一个带有unicode字符的字符串,则可以打印它,并获得未转义的版本: 但是如果我们有一个包含上面字符串的列表并打印出来: 您仍然会获得转义的字符序列。您如何才能使列表的内容不被转义,这可能吗?像这样: 另外,如果字符串是类型,那么您如何与上述相同? 问题答案: 打印字符串时,将获得对象方法的输出- 在这种情况下,该字符串不带引号。列表的方法不同,它创建一个包含打开和关闭的字符

  • 在JSON中,Unicode字符可以使用表示法进行转义。我假设显然是指十六进制的Unicode代码点。 但由于只有4位数字,这是否意味着无法转义