繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM