[英]JSON character encoding in javascript different from java
下面的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,例如 ""\•é",字节码为 [123, 34, 97, 108, 101, 114, 116, 34, 58, 34, 92, 117, 50, 48, 50, 50, -61, -87, 34, 125]
如何在 Javascript 中获得相同的精确输出(就字节序列而言)? 我不明白为什么 JSONObject 只转义一个字符而不转义另一个。 我不知道它遵循什么规则。
似乎在 javascript 中,我只能转义除 ASCII 之外的所有内容(例如。\-\)或根本不转义。
谢谢!
发生了两种不同的事情: Unicode 编码和JSON 字符串转义。
根据 JSON RFC 的2.5 字符串:
.. 除必须转义的字符外,所有 Unicode 字符都可以放在引号内。
任何字符都可以转义。 如果字符在基本多语言平面(U+0000 到 U+FFFF)中,那么它可以表示为一个六字符序列.. [BMP 之外的字符被转义为 UTF-16 编码的代理对]
即"•é"
和"\•é"
的JSON字符串是等价的。 完全取决于要转义的(附加)字符的序列化实现,并且两种形式都是有效的。
正是这个 JSON 字符串(它是 Unicode 文本)可以在转换为字节流时进行编码。 在示例中,它是通过 UTF-8 编码进行编码的。 一个 JSON 字符串可能是等价的,而在流级别不是字节等价的,也不是在 JSON 文本级别是字符等价的。
至于JSONObject的规则,它根据
c < ' '
|| (c >= '\u0080' && c < '\u00a0')
|| (c >= '\u2000' && c < '\u2100')
可以对[\ , \℀]
范围内的这些字符进行转义的原因之一是确保生成的 JSON 也是有效的 JavaScript。 文章JSON:未讨论此问题的 JavaScript 子集:问题在于 Unicode 代码点\
和\
被视为 JavaScript 字符串文字中的行终止符,而不是 JSON。 (范围内还有其他 Unicode分隔符字符:不妨一口气抓住它们。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.