JSON和转义字符

Jas*_*n S 52 unicode json

我有一个字符串,它在Javascript中被序列化为JSON,然后反序列化为Java.

看起来如果字符串包含度数符号,那么我就会遇到问题.

我可以帮助找出应该责怪的人:

  • 它是Spidermonkey 1.8的实现吗?(这里面有一个JSON实现)
  • Google gson吗?
  • 我不做正确的事吗?

这是JSDB中发生的事情:

js>s='15\u00f8C'
15°C
js>JSON.stringify(s)
"15°C"
Run Code Online (Sandbox Code Playgroud)

我希望"15\u00f8C'这让我相信Spidermonkey的JSON实现没有做正确的事情...除了JSON主页的语法描述(是规范吗?)说char可以是

any-Unicode-character- except - " - 或 - \ - or- control-character"

所以也许它按原样传递字符串而不将其编码为\ u00f8 ...在这种情况下我会认为问题出在gson库中.

有人可以帮忙吗?

我想我的解决方法是使用不同的JSON库,或者在调用后自己手动转义字符串JSON.stringify()- 但如果这是一个错误,那么我想提交错误报告.

McD*_*ell 72

这不是任何一个实现中的错误.没有要求逃避U + 00B0.引用RFC:

2.5.字符串

字符串的表示类似于C系列编程语言中使用的约定.字符串以引号开头和结尾.除了必须转义的字符外,所有Unicode字符都可以放在引号内:引号,反向固定和控制字符(U + 0000到U + 001F).

任何角色都可能被转义.

转义所有内容都会增加数据的大小(所有Unicode转换格式中的所有代码点都可以用四个或更少的字节表示;而对它们进行编码则会使它们成为六个或十二个字节).

您更有可能在代码中的某处出现文本转码错误,并且转义ASCII子集中的所有内容都会掩盖问题.所有数据都使用Unicode编码,这是JSON规范的要求.

  • @user:支持不在英语基本字母表中的字符,没有什么远程懒惰的.欢迎来到2015年,我们不再使用ASCII了. (10认同)

Jas*_*n S 71

嗯,这里有一个解决方法:

function JSON_stringify(s, emit_unicode)
{
   var json = JSON.stringify(s);
   return emit_unicode ? json : json.replace(/[\u007f-\uffff]/g,
      function(c) { 
        return '\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4);
      }
   );
}
Run Code Online (Sandbox Code Playgroud)

测试用例:

js>s='15\u00f8C 3\u0111';
15°C 3?
js>JSON_stringify(s, true)
"15°C 3?"
js>JSON_stringify(s, false)
"15\u00f8C 3\u0111"
Run Code Online (Sandbox Code Playgroud)

  • 在这里 Ping 一个旧的答案,但对于 BMP 之外的字符来说,这似乎会失败。 (3认同)

Jef*_*wer 9

这已经太晚了,可能不再相关了,但如果有人偶然发现这个答案,我相信我知道原因。

因此,JSON 编码的字符串与其中的度数符号完全有效,正如另一个答案提到的那样。问题很可能出在您正在读取/写入的字符编码中。根据您使用 Gson 的方式,您可能会向它传递一个java.io.Reader实例。Reader任何时候从 an创建 a 时InputStream,都需要指定字符编码或java.nio.charset.Charset实例(通常最好使用java.nio.charset.StandardCharsets.UTF_8)。如果您不指定Charset,Java 将使用您的平台默认编码,在 Windows 上通常为CP-1252