use*_*841 1 javascript java unicode json jsonobject
下面的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();
};
Run Code Online (Sandbox Code Playgroud)
生成一个 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 字符串:
.. 除必须转义的字符外,所有 Unicode 字符都可以放在引号内。
任何字符都可以转义。如果字符在基本多语言平面(U+0000 到 U+FFFF)中,那么它可以表示为一个六字符序列 .. [并且 BMP 之外的字符被转义为 UTF-16 编码的代理对]
也就是说,的JSON字符串"•é"
,并"\u2022é"
有相当的。完全取决于要转义的(附加)字符的序列化实现,并且两种形式都是有效的。
正是这个 JSON 字符串(它是 Unicode 文本)可以在转换为字节流时进行编码。在示例中,它是通过 UTF-8 编码进行编码的。一个 JSON 字符串可能是等价的,而在流级别不是字节等价的,也不是在 JSON 文本级别是字符等价的。
至于JSONObject的规则,它根据
c < ' '
|| (c >= '\u0080' && c < '\u00a0')
|| (c >= '\u2000' && c < '\u2100')
Run Code Online (Sandbox Code Playgroud)
范围内的这些字符[\u2000, \u2100]
可能被转义的原因之一是确保生成的 JSON 也是有效的 JavaScript。文章JSON:未讨论此问题的 JavaScript 子集:问题在于 Unicode 代码点,\u2028
并且在 JavaScript 字符串文字\u2029
中被视为行终止符,但不是 JSON。(范围内还有其他 Unicode分隔符字符:不妨一口气抓住它们。)
归档时间: |
|
查看次数: |
1708 次 |
最近记录: |