javascript中与java不同的JSON字符编码

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)或根本不转义。

谢谢!

use*_*740 5

发生了两种不同的事情: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分隔符字符:不妨一口气抓住它们。)