JSON和转义字符
我有一个string被序列化为JavaScript中的JSON,然后反序列化到Java。
它看起来像是如果string包含度符号,那么我得到一个问题。
我可以用一些帮助来找出责怪谁:
- 是Spidermonkey 1.8的实现吗? (这有一个JSON实现内置)
- 它是谷歌gson ?
- 难道我没有正确地做某事吗?
这里是在JSDB中发生的事情:
js>s='15\u00f8C' 15°C js>JSON.stringify(s) "15°C"
我会期望"15\u00f8C'
,这导致我相信,Spidermonkey的JSON实现不是做正确的事情…除了JSON主页的语法描述 (是规格?)说,一个字符可以
任何-Unicode-character-除了 – “ – 或 – \ – 或 – 控制字符”
所以也许它会按照原样传递string,而不会将其编码为\ u00f8 …在这种情况下,我会认为问题出在gson库上。
谁能帮忙?
我想我的解决方法是使用不同的JSON库,或调用JSON.stringify()
后自己手动转义string – 但如果这是一个错误,那么我想提交一个错误报告。
这不是两个实现中的错误。 没有要求逃脱U + 00B0。 引用RFC :
2.5。 string
string的表示类似于C系列编程语言中使用的约定。 一个string以引号开头和结尾。 除了必须转义的字符:引号,反转斜线和控制字符(U + 0000到U + 001F)之外,所有Unicode字符都可以放在引号内。
任何angular色都可能被转义。
转义所有东西会膨胀数据的大小(所有的代码点可以在所有的Unicode转换格式中用四个或更less的字节来表示,而编码它们都会使它们变成六个或十二个字节)。
在代码中某处出现文本转码错误的可能性更大,并且转义ASCII子集中的所有内容都会掩盖该问题。 所有数据都使用Unicode编码是JSON规范的一个要求。
嗯,好吧,这是一个解决方法:
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); } ); }
testing用例:
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"