我有一个字符串,它在Javascript中被序列化为JSON,然后反序列化为Java。
如果字符串包含度数符号,那么我就会遇到问题。
我可以帮助找出应该责怪的人:
以下是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()
后自己手动转义字符串 - 但如果这是一个错误,那么我想提交错误报告。
答案 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。