我有一个字符串,它在Javascript中被序列化为JSON,然后反序列化为Java.
看起来如果字符串包含度数符号,那么我就会遇到问题.
我可以帮助找出应该责怪的人:
这是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规范的要求.
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)
这已经太晚了,可能不再相关了,但如果有人偶然发现这个答案,我相信我知道原因。
因此,JSON 编码的字符串与其中的度数符号完全有效,正如另一个答案提到的那样。问题很可能出在您正在读取/写入的字符编码中。根据您使用 Gson 的方式,您可能会向它传递一个java.io.Reader
实例。Reader
任何时候从 an创建 a 时InputStream
,都需要指定字符编码或java.nio.charset.Charset
实例(通常最好使用java.nio.charset.StandardCharsets.UTF_8
)。如果您不指定Charset
,Java 将使用您的平台默认编码,在 Windows 上通常为CP-1252。