下面的Java代码
JSONObject obj = new JSONObject();
try{
obj.put("alert","•é");
byte[] test = obj.toString().getBytes("UTF-8");
logger.info("bytes are"+ test);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
产生一个JSONObject,它转义项目符号字符,但不转义带有严重字母的拉丁字母e,例如““ \u2022é”,其字节码为[123、34、97、108、101、114、116、34、58, 34,92,117,50,48,50,50,-61,-87,34,125]
如何获得相同的Javascript输出(就字节顺序而言)?我不明白为什么JSONObject只转义一个字符而不转义另一个字符。我不知道它遵循什么规则。
在javascript中,我似乎只能对ASCII以外的所有字符进行转义(例如,\ u007f- \ uffff),或者根本不进行转义。
谢谢!
发生了两种不同的情况:Unicode编码和JSON字符串转义。
根据JSON RFC的2.5 Strings:
..所有Unicode字符都可以放在用引号引起来,但必须转义的字符除外..
任何字符都可以转义。如果角色在基本版中多语言平面(U + 0000至U + FFFF),则可能是表示为六个字符的序列.. [并且BMP之外的字符以UTF-16编码的代理对进行转义]
即,"•é"
和"\u2022é"
的JSON字符串为equivalent。这完全取决于要转义(其他)字符并且两种格式均有效的序列化实现。
是此JSON字符串(是Unicode文本),当转换为字节流时可以进行encoded。在示例中,它是通过UTF-8编码进行编码的。 JSON字符串然后可能等效于without,在流级别等效于字节,或者在JSON文本等效于字符。
就JSONObject的规则而言,它是escapes according to
c < ' '
|| (c >= '\u0080' && c < '\u00a0')
|| (c >= '\u2000' && c < '\u2100')
这些字符在[\u2000, \u2100]
范围内可以被转义的原因是,确保生成的JSON也是有效的JavaScript。文章JSON: The JavaScript subset that isn't讨论了这个问题:问题是在JavaScript字符串文字中,Unicode代码点\u2028
和\u2029
被视为行终止符,而不是JSON。 (范围内还有其他Unicode Separator字符:不妨一口气将它们捕获。)