JavaScript中与Java不同的JSON字符编码

问题描述 投票:0回答:1

下面的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),或者根本不进行转义。

谢谢!

java javascript json unicode jsonobject
1个回答
4
投票

发生了两种不同的情况: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字符:不妨一口气将它们捕获。)

© www.soinside.com 2019 - 2024. All rights reserved.