JSON和转义字符

时间:2011-02-04 17:39:49

标签: json unicode

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

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

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

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

以下是JSDB中发生的事情:

js>s='15\u00f8C'
15°C
js>JSON.stringify(s)
"15°C"

我本来期望"15\u00f8C'让我相信Spidermonkey的JSON实现没有做正确的事情......除了JSON homepage's syntax description(是那个规范?)说的是char可以

  

任何-Unicode的character-       除非 - “ - 或 - \ - 或 -       控制字符“

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

有人可以帮忙吗?

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

3 个答案:

答案 0 :(得分:70)

嗯,好吧,无论如何,这是一个解决方法:

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);
      }
   );
}

测试用例:

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"

答案 1 :(得分:68)

这两个实现中都不是错误。没有要求逃避U + 00B0。引用RFC

  

<强> 2.5。字符串

     

字符串的表示是   类似于C中使用的惯例   编程语言家族。一个   字符串以引号开头和结尾   分数。所有Unicode字符都可以   放在引号内   除了必须的字符   逃脱:引号,反转   固体和控制字符   (U + 0000到U + 001F)。

     

任何字符可能被转义。

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

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

答案 2 :(得分:0)

这是超级晚了,可能不再适用了,但是如果有人偶然发现了这个答案,我相信我知道原因了。

因此,JSON编码的字符串在其中带有度数符号的情况下是完全有效的,如其他答案所述。该问题最有可能是您在读取/写入时使用的字符编码造成的。根据您使用Gson的方式,您可能会向其传递一个java.io.Reader实例。每当您从Reader创建InputStream时,您需要指定字符编码或java.nio.charset.Charset实例(通常最好使用{{1 }}。如果您未指定java.nio.charset.StandardCharsets.UTF_8,则Java将使用平台默认编码,在Windows上通常为CP-1252